デーモンスレッドとスレッドグループ


デーモンスレッド
Javaには、User Thread(ユーザスレッド)、Daemon Thread(デーモンスレッド)の2種類のスレッドがあります.
ユーザスレッドはフロントで実行されるスレッドであり、デーモンスレッドはバックグラウンドで実行されるスレッドである.デーモン・スレッドの役割は、他のフロント・スレッドの実行に便利なサービスを提供し、ゴミ回収スレッドがデーモン・スレッドであるなど、通常の非デーモン・スレッドがまだ実行されている場合にのみ必要です.VMが1つのデーモンスレッドしか残っていないことを検出し、ユーザスレッドが実行を終了した場合、VMは終了します.ユーザスレッドが保護されていないため、プログラムを実行し続ける必要はありません.デーモン以外のスレッドがまだ存在する場合、VMは終了しません.
すなわち、バックグラウンド以外のすべてのスレッドが終了すると、バックグラウンドスレッドも自動的に終了します.
デーモンスレッドは仮想マシン内のみではなく、ユーザーがプログラムを作成するときに自分でデーモンスレッドを設定することもできます.現在のスレッドをデーモンスレッドとして設定するには、ThreadのsetDaemon(true)メソッドを使用します.このスレッドがデーモンスレッドであるかどうかを検出するには、ThreadのisDaemon()メソッドを使用します.
package com.wrh.threadInterrupt;
/* *          * */
public class DaemonThread extends Thread {
    public DaemonThread(){
        this.setDaemon(true);//          
        this.start();

    }
    public static void main(String[] args) {
        Thread t=new DaemonThread();
        System.out.println(t.isDaemon());
    }

}

デーモン・スレッドは便利かもしれませんが、他のすべての非デーモン・スレッドが消滅した場合、その終了によって危害が発生しないように注意する必要があります.すべてのユーザー・スレッドが実行を終了する前に、デーモン・スレッドが予想されるサービス・タスクを完了したかどうかを知ることはできません.すべてのユーザスレッドが終了すると、仮想マシンも実行を終了します.したがって、データの読み書きなど、デーモンスレッドでビジネスロジック操作を実行しないでください.
注意すべき点はいくつかあります.
1、setDaemon(true)        start()      ,     IllegalThreadStateException  。

2、                  。  
3、                         ,            。

スレッドグループ
Javaでは、各スレッドがスレッドグループ管理の一員に属します.たとえば、メイン関数main()ワークフローでスレッドが生成されると、生成されたスレッドはmainというスレッドグループ管理の一員に属します.簡単に言えば、スレッドグループはjavaであるスレッドからなる管理スレッドのクラスである.lang.ThreadGroupクラス.このスレッドが属するスレッドグループの名前は、次のコードを使用して取得できます.
Thread.currentThread().getThreadGroup().getName();

Thread.CurrentThread():現在のスレッドを取得します.getThreadGroup():現在のスレッドが存在するグループを取得します.getName():グループの名前を取得します.
次のコードで実現できるスレッドグループを定義します.
ThreadGroup group=new ThreadGroup("group");
Thread t=new Thread(group,"thread----wuranghao");

具体的なインスタンスコードは次のとおりです.
package com.wrh.threadInterrupt;
/* *          * */
public class DaemonThread extends Thread {
    public DaemonThread() {
        super();
        this.setDaemon(true);
        this.start();
    }

    public static void main(String[] args) {
        DaemonThread t=new DaemonThread();  
        System.out.println(t.isDaemon());
        System.out.println(Thread.currentThread().getThreadGroup().getName());
        System.out.println(t.getThreadGroup().getName());
    }

}
/*     : main main //       :main           main    。 */
package com.wrh.threadInterrupt;
/* *          * */
public class DaemonThread extends Thread {
    public DaemonThread(ThreadGroup group, String name) {
        super(group, name);
        this.setDaemon(true);
        this.start();
    }

    public static void main(String[] args) {
        ThreadGroup group=new ThreadGroup("thread group-1");
        DaemonThread t=new DaemonThread(group,"first thread in group-1");

        System.out.println(t.isDaemon());
        System.out.println(Thread.currentThread().getThreadGroup().getName());
        System.out.println(t.getThreadGroup().getName());
    }

/*     : main thread group-1 */  
//       ,      ,             。

}

ThreadGroupクラスのいくつかの方法は、スレッドグループ内のスレッドに作用します.たとえば、setMaxPriority()メソッドでは、スレッドグループ内のすべてのスレッドが最大の優先度を持つように設定できます.