자바/프로세스와 쓰레드

쓰레드의 우선순위와 쓰레드 그룹

백_곰 2022. 2. 14. 17:08

1. 쓰레드의 우선순위에 대한 개념

- 쓰레드는 기본적으로 우선순위라는 속성(멤버변수)를 가진다.

- 이 값에 따라 실행시간이 달라진다.

- 쓰레드가 가질 수 있는 우선순의 값 범위는 1~10이며 높을수록 높다. 

- 기본적으로 5의 값을 가진다.

 

- 만약 각각 쓰레드 th1, th2는 7와 5의 우선순위를 가진다면, 싱글 코어에서는 th1부터 먼저

실행하게 되며, th2보다 더 빨리 작업을 마친다. 그러나 만약 멀티코어에서 수행하게 되면

th1이 더 빨리 수행되긴하지만 거의 차이 없이 똑같이 번갈아가면서 출력한다.

 

( 멀티코어에서는 별 차이가 없을정도가 아니라 전혀 없다. )

( 그러므로, 우선순위를 부여하는 대신 PriorityQueue 클래스에 저장해 놓고, 우선순위가 높은

작업을 먼저 처리하는 것이 낫다. )

 

 

( 위의 그림은 싱글 코어로 두 개의 쓰레드로 두 개의 작업을 실행했을 때의 결과를 보여준다. )

( 싱글코어에서는 확실히 똑같은 시간에서 작업량의 차이가 나지만, 멀티코어는 의미가 없어진다. )

 

 

 

 

2. 쓰레드 그룹

- 쓰레드 그룹은 말 그대로 쓰레드의 그룹이며, 우리가 파일을 다루는 것과 같다.

- 만들어진 이유는 보안상 때문인데, 자신이 속한 그룹의 쓰레드나 하위 쓰레드를 변경할 수

있지만, 서로 다른 그룹의 쓰레들끼리는 서로 변경할 수 없다.

 

- 모든 쓰레드는 쓰레드 그룹에 속해야한다. 그러므로, JVM은 main과 system을 만들고

운영에 필요한 쓰레드를 생성해서 그룹에 포함시킨다.

( 예를 들어, main 메서드는 main 쓰레드 그룹에, Finalizer 쓰레드는 system에 속한다. )

 

- 우리가 생성하는 모든 쓰레드 그룹은 main 쓰레드 그룹의 하위 쓰레드 그룹이다.1

 

 

- 쓰레드 그룹과 관련된 메서드는 아래와 같다.

메서드 설명
ThreadGroup getThreadGroup() 쓰레드 자신이 속한 쓰레드 그룹을 반환한다.
void uncaughtException(Tread t, Throwable e) 쓰레드 그룹의 쓰레드가 처리되지 않은 예외에 의해 실행이 종료되었을 때, JVM에 의해 이 메서드가 자동적으로 호출된다.

 

 

 

 

2-1. 쓰레드 그룹을 이해하기 위한 예제(1)

: 기본적으로 쓰레드를 만들고 그룹을 생성하여 그에 대한 정보를 출력해보는 예제이다.

 

public class Exercise006 {

	public static void main(String[] args) {
		ThreadGroup main = Thread.currentThread().getThreadGroup();
		ThreadGroup grp1 = new ThreadGroup("Group1");
		ThreadGroup grp2 = new ThreadGroup("Group2");
		
		//ThreadGroup(ThreadGroup parent ,String name)
		ThreadGroup subGrp1 = new ThreadGroup(grp1, "SubGroup1");
		
		grp1.setMaxPriority(3);
		
		Runnable r = new Runnable() {
			@Override
			public void run() {
				try {
					Thread.sleep(1000);
				}catch (Exception e) {
					// TODO: handle exception
				}
				
			}
		};
		//Thread(ThreadGroup tg, Runnable r, String name)
		new Thread(grp1, 	r, "th1").start();
		new Thread(grp2, 	r, "th2").start();
		new Thread(subGrp1, r, "th1-1").start();
		
		
		System.out.println(">>List of ThreadGroup: " + main.getName()
				+", Active ThreadGroup: " + main.activeGroupCount()
				+", Active Thread: " + main.activeCount());
		main.list();
	}
}

 

( currentThread()는 현재 실행중인 쓰레드의 참조를 반환한다. )

 

( 새로 생성된 쓰레드 그룹은 main 쓰레드 그룹의 하위 그룹으로 포함된다. )

 

( setMaxPriority(3)을 grp1에 했더니, 하위 그룹에게도 영향을 주었다. )

 

( 참조변수 없이 new Thread()로 만들었는데, 가비지 컬렉터의 제거대상이 되지 않는다. )

( 그 이유는 이 쓰레드의 참조가 ThreadGroup에 저장되어 있기 때문이다. )