ここに簡単な証拠があります。すべての非メインスレッドがデーモンがある場合は、メインスレッドが死ぬ一度彼らはすべて死ぬ:
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
しかし、私はデバッガで見た状況について質問することがあります - 私はメインスレッドは表示されませんが、デーモン(デーモンではない)を見ることができます。スレッドの総数は50%近く減少しました。 – user710818
デーモンではない1つのスレッド(おそらく、デーモンとしてスレッドにフラグを立てていないライブラリによって開始された)でも、プログラムを実行し続けるでしょう。 –
docsとの矛盾についての私の質問(タイトルを読んでください) - デーモンのスレッドはメインスレッドなしでは存在できないと言われていました。 – user710818