大家好,当封闭它的线程完成后,守护程序线程是否会停止工作?或者“主”线程完成后守护程序线程会停止吗?
我在jre6上测试了这个例子,结果是 daemon thread stopped working when the enclosing it thread finished
. 请注意,java docs表示当没有其他应用程序线程时,守护程序线程将被终止 . 并且不会说父级非守护程序线程保留时会杀死守护程序线程 .
请给我答案 . 请寄给我关于这个问题的任何材料 . 对不起我的英语不好 .
public class Main {
public static void main(String[] args) {
Thread simple = new Thread(new SimpleTask());
simple.start();
}
}
class SimpleTask implements Runnable {
public void run() {
try {
Thread daemon = new Thread(new DaemonTask());
daemon.setDaemon(true);
daemon.start();
Thread.sleep(5000);
} catch (InterruptedException e) {}
};
}
class DaemonTask implements Runnable {
public void run() {
int i = 0;
while (true) {
try {
System.out.println("a" + (i++));
Thread.sleep(500);
} catch (InterruptedException e) {}
}
}
}
4 回答
守护程序线程停止工作,因为没有任何非守护程序线程,而不是因为父线程已完成 .
在Java中没有"enclosing thread"这样的概念 . 有线程组但它们很少使用 .
守护程序线程只是线程,它们不会留下任何非守护程序线程,JVM将终止 . 如果仍有一些非守护程序线程正在执行,JVM将继续运行,包括任何守护程序线程 - 无论启动这些守护程序线程的线程是否已完成 .
由于主线程在启动简单线程后立即结束,因此简单线程是最后完成的应用程序线程,因此守护线程在此线程结束时结束 .
简单线程是启动守护程序线程的线程与此无关 .
当主执行线程和所有用户线程终止执行时,JVM将停止守护程序线程 . 然后,您的守护程序线程严格依赖于用户线程的执行和程序的主线程 .
相反,JVM将关闭您的程序,直到所有用户线程都被终止 .
回顾一下, the user thread is a thread that keeps a program from quitting ,因为即使程序的主线程被终止,JVM也不会在所有用户线程完成所请求的作业之前停止程序 . 只有当所有用户线程都已终止时,JVM才能关闭程序 .
然后, a daemon thread is a thread that doesn't keep your program from quitting . 有关其他信息,请查看SO的this旧问题 .
检查Thread API .
setDaemon()
方法的文档报告如下:或Runtime API: