这里有一个简单的证明。如果所有非主线程是守护进程,他们都死了,一旦主线程死亡:
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 2012-01-12 10:27:27
即使一个非守护线程(可能由一个没有将该线程标记为守护进程的库启动)也会使程序继续运行。 – 2012-01-12 10:31:03
我的问题(请阅读标题)关于与docs的矛盾 - 在那里说守护线程不能没有主线程存在。 – user710818 2012-01-12 10:33:19