13-6. 第3グループ


Thread Group(Thread Group)
相互に関連付けられたThreedの束.
ねじグループは、ディレクトリのように構造化された組み込み関係を有することもできる.
ねじグループは、その属するグループまたはサブグループのねじを変更できます.
他のネジセットのネジは変更不可
すべてのねじがねじグループに含まれている必要があるため、グループを作成者として指定します.
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 ThreadはIntelliJが生成したThreadである.
    このとき、G 1の最大優先度はsetMaxPriority()が3として指定されるので、サブスレッドとグループの両方が同じ優先度値であると判断することができる.
     
    参照変数なしでnew Thread(...)を使用してスレッドを作成し、直ちに実行するため、GCで削除されたと考えられる.
    このねじの参照はねじ群に格納されているので、GCは削除されません.