정의
- 서로 관련 있는 스레드들을 그룹으로 묶어서 다룰 수 있는 기능이다.
- JVM이 시작되면 system 그룹이 생성되고 스레드들은 기본적으로 system 그룹에 포함된다.
- 메인 스레드는 system 그룹 하위에 있는 main 그룹에 포함된다.
- 모든 스레드들은 반드시 하나의 그룹에 포함되어있어야한다.
- 그룹을 지정해주지 않을 경우 기본적으로 자신이 생성한 스레드와 동일한 스레드 그룹에 속하게 된다.
// ThreadGroup 클래스로 객체를 만듭니다.
ThreadGroup group1 = new ThreadGroup("Group1");
// Thread 객체 생성시 첫번째 매개변수로 넣어줍니다.
// Thread(ThreadGroup group, Runnable target, String name)
Thread thread1 = new Thread(group1, task, "Thread 1");
// Thread에 ThreadGroup 이 할당된것을 확인할 수 있습니다.
System.out.println("Group of thread1 : " + thread1.getThreadGroup().getName());
왜 사용하는가?
- 그룹으로 묶어서 일괄적으로 스레드를 관리할 수 있다.
- 스레드 그룹에서 제공하는 interrupt()를 호출하면 그룹 내 모든 스레드를 일괄적으로 안전하게 interrupt할 수 있다.
- 이외에도 모든 스레드를 제거하는 destory(), 추가하는 add(), 그룹내 하나의 스레드만 제거하는 remove() 등 다양한 메서드를 제공한다.
// ThreadGroup 클래스로 객체를 만듭니다.
ThreadGroup group1 = new ThreadGroup("Group1");
// Thread 객체 생성시 첫번째 매개변수로 넣어줍니다.
// Thread(ThreadGroup group, Runnable target, String name)
Thread thread1 = new Thread(group1, task, "Thread 1");
Thread thread2 = new Thread(group1, task, "Thread 2");
// interrupt()는 일시정지 상태인 쓰레드를 실행대기 상태로 만듭니다.
group1.interrupt();
- 이러한 방법으로 스레드 그룹을 관리하고 제어할 수 있다.
public class Main {
public static void main(String[] args) {
Runnable task = () -> {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName());
} catch (InterruptedException e) {
break;
}
}
System.out.println(Thread.currentThread().getName() + " Interrupted");
};
// ThreadGroup 클래스로 객체를 만듭니다.
ThreadGroup group1 = new ThreadGroup("Group1");
// Thread 객체 생성시 첫번째 매개변수로 넣어줍니다.
// Thread(ThreadGroup group, Runnable target, String name)
Thread thread1 = new Thread(group1, task, "Thread 1");
Thread thread2 = new Thread(group1, task, "Thread 2");
// Thread에 ThreadGroup 이 할당된것을 확인할 수 있습니다.
System.out.println("Group of thread1 : " + thread1.getThreadGroup().getName());
System.out.println("Group of thread2 : " + thread2.getThreadGroup().getName());
thread1.start();
thread2.start();
try {
// 현재 쓰레드를 지정된 시간동안 멈추게 합니다.
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// interrupt()는 일시정지 상태인 쓰레드를 실행대기 상태로 만듭니다.
group1.interrupt();
}
}