[JAVA] Thread - 4(스레드 그룹)

권재현·2024년 10월 25일

JAVA

목록 보기
7/11

정의

  • 서로 관련 있는 스레드들을 그룹으로 묶어서 다룰 수 있는 기능이다.
    • 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();

    }
}
profile
여전히 헤매이고 있습니다.

0개의 댓글