我正在阅读关于Java的setDaemon()方法的文档,当我不等待守护进程线程完成而读取JVM退出时,我感到困惑。
但是,由于守护进程线程本质上是Java的Thread,它可能依赖于JVM来实现其功能,如果JVM在守护进程线程完成之前退出,守护进程线程如何生存呢?
发布于 2015-07-06 17:41:33
他们活不下去。JVM将在除守护进程之外的所有线程都死掉时退出。
启动应用程序时,JVM将启动一个非守护进程线程来运行静态主方法。
一旦主方法退出,这个主线程就会死掉,如果您没有生成其他非守护进程线程,JVM就会退出。
但是,如果您启动了另一个线程,JVM将不会退出,它将等待所有非守护进程线程在退出之前死亡。
如果你所生成的线程正在做一些至关重要的事情,这绝对是正确的,不管你经常有一些线程不是那么重要,也许它们是在听一些可能发生或不可能发生的外部事件。
因此,理论上,您应该在某个地方放置一些代码来停止您生成的所有线程,以允许JVM退出。
因为这很容易出错,所以标记像守护进程这样的非重要线程就更容易了。如果它们被标记为这些线程,JVM将不会等待它们在退出之前死亡,JVM将在“主线程”(那些未标记为守护进程的线程)死后退出并杀死这些线程。
要将其放入代码中,如下所示:
public class Spawner {
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
public void run() {
while (true) {
System.out.println("I'm still alive");
}
}
});
// Try uncommenting/commenting this line
// t.setDaemon(true);
t.start();
System.out.println("Main thread has finished");
}
}(我还没有测试过这段代码,而是直接在这里编写的,所以它可能包含愚蠢的错误)。
当运行带有注释行的代码时,线程并不是deamon,所以即使您的主方法已经完成,您也会继续使用CTRL+C停止控制台,也就是说,JVM不会退出。
如果取消对行的注释,那么线程是一个守护进程,在主方法完成后不久,线程将被杀死,JVM将退出,而不需要CTRL+C。
https://stackoverflow.com/questions/31252227
复制相似问题