13-6. 쓰레드 그룹

Hyun Jun·2022년 2월 12일
0

자바의 정석

목록 보기
49/52
post-thumbnail
post-custom-banner

쓰레드 그룹 (Thread Group)

서로 관련된 쓰레드의 묶음.

쓰레드 그룹도 디렉토리처럼 구조화된 포함 관계를 가질 수 있음.

쓰레드 그룹은 자신이 속한 그룹이나 하위 그룹의 쓰레드 변경 가능

그 외의 다른 쓰레드 그룹의 쓰레드는 변경 불가

모든 쓰레드는 반드시 쓰레드 그룹에 포함되어 있어야하므로 생성자로 그룹을 지정

Thread(Threadgroup tg, String name)
Thread(Threadgroup tg, Runnable r)
Thread(Threadgroup tg, Runnable r, String name)
Thread(Threadgroup tg, Runnable r, String name, long stackSize)

Java로 짜여진 어플리케이션이 실행되면, JVMmainsystem이라는 이름의 쓰레드 그룹을 만들고 JVM 운영에 필요한 쓰레드들을 생성해 그룹에 포함시킴.

프로그래머가 생성하는 모든 쓰레드 그룹은 main 그룹의 하위 그룹이 됨.

만약 쓰레드 그룹을 지정하지 않고 쓰레드를 생성하면 main 그룹으로 들어감.

 

Thread 클래스에서 쓰레드 그룹과 관련된 메서드

  • ThreadGroup getThreadGroup()

    자신이 속한 쓰레드 그룹 반환

  • void uncaughtException(Thread t, Throwable e)

    쓰레드 그룹 내의 쓰레드가 처리되지 않은 예외에 의해 실행 종료되었을 대, JVM에 의해 이 메서드가 자동 호출됨.

 

class ThreadExample {
    public static void main(String[] args) throws Exception {
        ThreadGroup main = Thread.currentThread().getThreadGroup(); // main 쓰레드 그룹
        ThreadGroup g1 = new ThreadGroup("G1");
        ThreadGroup g2 = new ThreadGroup("G2");

        ThreadGroup subG1 = new ThreadGroup(g1, "SubG1"); // G1 그룹의 하위(sub) 그룹

        g1.setMaxPriority(3); // G1 쓰레드 그룹의 최대 우선순위를 3으로 변경

        Runnable r = new Runnable() { // 익명 클래스로 인터페이스 구현 (일회성)
            @Override
            public void run() {
                try {
                    Thread.sleep(1000); // 쓰레드 정보를 출력하기도 전에 쓰레드가 종료되는 것을 방지하기 위해 1초 멈춤
                } catch (InterruptedException e) {}
            }
        };

        new Thread(g1, r, "t1").start(); // 참조 변수 없이 쓰레드 생성 후 실행
        new Thread(subG1, r, "t2").start();
        new Thread(g2, r, "t3").start();

        System.out.println("Thread Group Name: " + main.getName()); // 쓰레드 그룹의 이름
        System.out.println("Active Group Count: " + main.activeGroupCount()); // 활성 상태인 쓰레드 그룹의 개수
        System.out.println("Active Thread Count: " + main.activeCount()); // 활성 상태인 쓰레드의 개수

        System.out.println();

        main.list(); // 쓰레드 그룹에 속한 모든 쓰레드와 하위 그룹 정보 출력
    }
}

실행 결과)

Thread Group Name: main
Active Group Count: 3
Active Thread Count: 5

java.lang.ThreadGroup[name=main,maxpri=10]
    Thread[main,5,main]
    Thread[Monitor Ctrl-Break,5,main]
    java.lang.ThreadGroup[name=G1,maxpri=3]
        Thread[t1,3,G1]
        java.lang.ThreadGroup[name=SubG1,maxpri=3]
            Thread[t2,3,SubG1]
    java.lang.ThreadGroup[name=G2,maxpri=10]
        Thread[t3,5,G2]

들여쓰기로 쓰레드 그룹 내의 구조가 출력되어있음.

Monitor Ctrl-Break 쓰레드는 intelliJ에서 생성한 쓰레드라고 함.

이 때, G1의 최대 우선순위를 setMaxPriority()로 3으로 지정해뒀기 때문에 하위 쓰레드와 그룹도 모두 같은 우선순위 값을 가진다는 것 확인 가능.

 

참조 변수 없이 new Thread(...)로 쓰레드를 생성한 후 바로 실행시켰기 때문에, GC에 제거된다고 생각할 수 있으나

이 쓰레드의 참조는 쓰레드 그룹 내에 저장되어 있기 때문에 GC가 제거하지 않음.

profile
Back-end Engineer 👨‍💻
post-custom-banner

0개의 댓글