2012-01-12 12 views
1

Eclipseで埋め込まれたマルチスレッドWebアプリケーションがTomcatに組み込まれています。いくつかのスレッドはデーモンであり、一部ではありません。 私が実行した後:メインスレッドが終了した後にデーモンスレッドが続行される可能性はありますか?

shutdown.bat 

は、私はいくつかのスレッドが仕事を終えていることがわかりますが、一部が残っています!奇妙な残りのスレッドでデーモンスレッド(私はEclipseのデバッグビューで見た)です。しかし、それは不可能です - 私はメインのスレッドは表示されませんが、デーモンのスレッドを参照してください!それはTomcat Webコンテナの特定のものにリンクしていますか、それとも私のWebアプリケーションに問題がありますか?おかげさまで Eclipseの組み込みTomcat特有のものですか?

答えて

3

はい。すべての非デーモンスレッドが終了すると、プログラムは終了します。 mainが実行している非デーモンスレッドを開始した場合、「main」というスレッドを持つことで何もしません。

+0

しかし、私はデバッガで見た状況について質問することがあります - 私はメインスレッドは表示されませんが、デーモン(デーモンではない)を見ることができます。スレッドの総数は50%近く減少しました。 – user710818

+0

デーモンではない1つのスレッド(おそらく、デーモンとしてスレッドにフラグを立てていないライブラリによって開始された)でも、プログラムを実行し続けるでしょう。 –

+0

docsとの矛盾についての私の質問(タイトルを読んでください) - デーモンのスレッドはメインスレッドなしでは存在できないと言われていました。 – user710818

1

ここに簡単な証拠があります。すべての非メインスレッドがデーモンがある場合は、メインスレッドが死ぬ一度彼らはすべて死ぬ:

class DaemonTask implements Runnable { 

    private final int id; 
    private final Thread main; 

    DaemonTask(int id, Thread main) { 

    this.id = id; 
    this.main = main; 
    } 

    @Override 
    public void run() { 

    while (true) { 

     System.out.println((Thread.currentThread().isDaemon() ? "" : "non") + " daemon id = " + id + "; main alive: " + main.isAlive()); 
     try { 
     Thread.sleep(100L * id); 
     } catch (InterruptedException e) { 
     e.printStackTrace(); 
     } 
    } 
    } 
} 

for (int i = 0; i < 10; i++) { 

    Thread t = new Thread(new DaemonTask(i + 1, Thread.currentThread())); 
    t.setDaemon(true); 
    t.start(); 
} 

System.out.println("main finishing"); 

出力で:

main finishing 
daemon id = 6; main alive: true 
daemon id = 3; main alive: true 
daemon id = 2; main alive: true 
daemon id = 10; main alive: true 
daemon id = 9; main alive: false 
daemon id = 8; main alive: false 
daemon id = 4; main alive: false 
Process finished with exit code 0 

我々が作成し、メインスレッドを離れる前に非デーモンスレッドを起動した場合:

new Thread(new DaemonTask(100, Thread.currentThread())).start(); 

アプリケーションが実行を継続します:

main finishing 
daemon id = 2; main alive: true 
daemon id = 1; main alive: true 
daemon id = 3; main alive: false 
daemon id = 4; main alive: false 
daemon id = 5; main alive: false 
daemon id = 7; main alive: false 
daemon id = 6; main alive: false 
non daemon id = 100; main alive: false 
daemon id = 10; main alive: false 
daemon id = 9; main alive: false 
daemon id = 8; main alive: false 
daemon id = 1; main alive: false 
daemon id = 2; main alive: false 
daemon id = 1; main alive: false 
daemon id = 3; main alive: false 
daemon id = 1; main alive: false 
daemon id = 4; main alive: false 
daemon id = 2; main alive: false 
1

デバッガを実行しているのは、基本的にJVM終了が期待通りに動作しないということです。

デベロッパーがJVMの終了時点でデーモンスレッドを検査する可能性があります。

これは、デバッガが実質的にアプリケーションの「メイン」スレッドであり、デバッガがその内部動作をUIに公開しないことを意味します。デバッガのコード自体にブレークポイントを設定することを想像してみてください...あなたがデバッグセッションをロックするので、それが少し混乱するかもしれません!

デバッガを使用していない場合、これが起こるとは思わないでください。

関連する問題