1

デーモン スレッドについて私が知っていることは、実行中のユーザー スレッドがなく、残りのすべてのスレッドがタイプ デーモンである場合、JVM は終了するということです。

以下のプログラムを実行すると、出力は常に最初の行として「メインスレッドの終了」として表示され、「Hello from Worker 0」などの出力がさらに数行まで表示されます。

私の質問は、ワーカースレッドがデーモンとして設定されている場合、メインスレッドが終了すると、ワーカースレッドは終了し、先に進まないはずですが、「Hello from Worker 0」と行の息子が出力され、しばらくするとJVMのみが終了するのはなぜですか?このように振る舞っていますか?

私の質問が有効でない場合は申し訳ありませんが、答えを知りたいのですが、疑いがあります。

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new WorkerThread().start() ;
        System.out.println("Main Thread ending") ;
    }

}
class WorkerThread extends Thread {

    public WorkerThread() {
        setDaemon(true) ;   
    }

    public void run() {
        int count=0 ;
        while (true) {
            System.out.println("Hello from Worker "+count++) ;
            count++;
        }
    }
}

出力

Main Thread ending
Hello from Worker 0
Hello from Worker 2
Hello from Worker 4
Hello from Worker 6
Hello from Worker 8

ありがとう

4

2 に答える 2

3

....しかし、まだ「Hello from Worker 0」と息子の行が出力され、しばらくするとJVMが終了するだけですが、なぜこのように動作するのですか?

最も可能性の高い説明は、JVM がメイン スレッドが終了したことに気付く前、または JVM シャットダウンの一部として他のクリーンアップ作業を行っている間に、ワーカー スレッドがこれらの行を System.out バッファーに書き込んだことです。

しかし、結局のところ、余分な出力が問題になる可能性は低いので、無視することをお勧めします。(これを消すのはかなり難しいかもしれません...)

于 2012-10-07T10:45:43.007 に答える
2

メインスレッドがその行を印刷した直後に終了することはどこでも保証されていないため、デーモンスレッドが何かを印刷できる時間枠がまだある可能性があります。

于 2012-10-07T11:26:11.347 に答える