[Java][Thread] 쓰레드 그룹(thread group)

2022. 6. 30. 12:56JAVA/Language

1. 쓰레드 그룹은 무엇인가?

  • 쓰레드 그룹은 서로 관련된 쓰레드를 그룹으로 다루기 위한 것
  • 쓰레드 그룹을 생성해서 쓰레드를 그룹으로 묶어서 관리 할 수 있음
  • 쓰레드 그룹에 다른 쓰레드 그룹을 포함시킬 수 있음

 

쓰레드 그룹 클래스의 생성자 / 메서드

생성자 / 메서드 설명
ThreadGroup(String name) 지정된 이름의 새로운 쓰레드 그룹을 생성
ThreadGroup(ThreadGroup parent, String name) 지정된 쓰레드 그룹에 포함되는 새로운 쓰레드 그룹을 생성
int activeCount() 쓰레드 그룹에 포함된 활성상태에 있는 쓰레드의 수를 반환
int activeGroupCount() 쓰레드 그룹에 포함된 활성항태에 있는 쓰레드 그룹의 수를 반환
void checkAccess() 현재 실행중인 쓰레드가 쓰레드 그룹을 변경할 권한이 있는지 체크합니다. 만일 권한이 없다면 SecurityException이 발생시킨다.
void destory() 쓰레드 그룹과 하위 쓰레드 그룹까지 모두 삭제합니다. 단, 쓰레드 그룹이나 하위 쓰레드 그룹이 비어있어야 합니다.
int enumerate(Thread[] list)
int enumerate(Thread[] list, boolean recurse)
int enumerate(ThreadGroup[] list)
int enumerate(ThreadGroup[] list, boolean recurse)
쓰레드 그룹에 속한 쓰레드 또는 하위 쓰레드 그룹의 목록을 지정된 배열에 담고 그 개수를 반환.
두번째 매개변수인 recurse의 값을 true로 하면 쓰레드 그룹에 속한 하위 쓰레드 그룹에 쓰레드 또는 쓰레드 그룹까지 배열에 담습니다.
int getMaxPriority() 쓰레드 그룹의 최대 우선순위를 반환
String getName() 쓰레드 그룹의 이름을 반환
ThreadGroup getParent() 쓰레드 그룹의 상위 쓰레드 그룹을 반환
void interrupt() 쓰레드 그룹에 속한 모든 쓰레드를 interrupt
boolean isDaemon() 쓰레드 그룹이 데몬 쓰레드그룹인지 확인
boolean isDestroyed() 쓰레드 그룹이 삭제되었는지 확인
void list() 쓰레드 그룹에 속한 쓰레드와 하위 쓰레드 그룹에 대한 정보를 출력
boolean parentOf(ThreadGroup g) 지정된 쓰레드 그룹의 상위 쓰레드 그룹인지 확인
void setDaemon(boolean daemon) 쓰레드 그룹을 데몬 쓰레드 그룹으로 설정/해제
void setMaxPriority(int pri) 쓰레드 그룹의 최대우선순위 설정

 

쓰레드 클래스의 ThreadGroup 클래스관련 생성자

Thread(ThreadGroup group, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)

쓰레드 그룹을 지정하는 생성자를 사용하지 않은 쓰레드는 기본적으로 자신을 생성한 쓰레드와 같은 쓰레드 그룹에 속하게 됩니다.

 

Thread의 쓰레드 그룹과 관련된 메서드

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

 

다음 예제는 쓰레드 그룹과 쓰레드를 생성하고 main.list()를 호출해서 main 쓰레드 그룹의 정보를 출력하는 예제입니다.

public class Driver {

	public static void main(String[] args) {
		ThreadGroup main = Thread.currentThread().getThreadGroup();
		ThreadGroup group1 = new ThreadGroup("Group1");
		ThreadGroup group2 = new ThreadGroup("Group2");
		
		ThreadGroup subGroup1 = new ThreadGroup(group1, "SubGroup1");
		
		group1.setMaxPriority(3);	// 최대우선순위 설정한 이후에 그룹에 추가되는 쓰레드들은 영향을 받음
		
		Runnable r = new Runnable() {
			
			@Override
			public void run() {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
		
		new Thread(group1, r, "th1").start();
		new Thread(subGroup1, r, "th2").start();
		new Thread(group2, r, "th3").start();
		
		System.out.println(">>List of ThreadGroup : " + main.getName() +			// main
							", Active ThreadGroup: " + main.activeGroupCount()+		// 3(main, group1, group2)
							", Active Thread: " + main.activeCount());				// 4(main, th1, th2, th3)
		main.list();
		
		
	}

}
>>List of ThreadGroup : main, Active ThreadGroup: 3, Active Thread: 4
java.lang.ThreadGroup[name=main,maxpri=10]
    Thread[main,5,main]
    java.lang.ThreadGroup[name=Group1,maxpri=3]
        Thread[th1,3,Group1]
        java.lang.ThreadGroup[name=SubGroup1,maxpri=3]
            Thread[th2,3,SubGroup1]
    java.lang.ThreadGroup[name=Group2,maxpri=10]
        Thread[th3,5,Group2]

 

References

source code : https://github.com/yonghwankim-dev/java_study/tree/main/ch13
[도서] Java의 정석, 남궁 성 지음