Java 守护进程线程在JVM退出后如何生存?
我正在阅读关于Java的Java 守护进程线程在JVM退出后如何生存?,java,multithreading,parallel-processing,jvm,daemon,Java,Multithreading,Parallel Processing,Jvm,Daemon,我正在阅读关于Java的setDaemon()方法的文档,当我读到JVM没有等待守护进程线程完成就退出时,我感到困惑 然而,由于守护进程线程本质上是Java线程,它们可能依赖于在JVM上运行来实现其功能,因此,如果JVM在守护进程线程完成之前退出,守护进程线程如何生存 他们活不下去了。当所有线程(守护进程线程除外)都已死亡时,JVM将退出 启动应用程序时,JVM将启动单个非守护进程线程来运行静态main方法 一旦main方法退出,这个主线程就会死亡,如果没有生成其他非守护进程线程,JVM就会退出
setDaemon()
方法的文档,当我读到JVM没有等待守护进程线程完成就退出时,我感到困惑
然而,由于守护进程线程本质上是Java
线程
,它们可能依赖于在JVM上运行来实现其功能,因此,如果JVM在守护进程线程完成之前退出,守护进程线程如何生存 他们活不下去了。当所有线程(守护进程线程除外)都已死亡时,JVM将退出
启动应用程序时,JVM将启动单个非守护进程线程来运行静态main方法
一旦main方法退出,这个主线程就会死亡,如果没有生成其他非守护进程线程,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不会退出
如果您取消对该行的注释,那么线程就是一个守护进程,在main方法完成后不久,线程将被终止,JVM将退出,而不需要CTRL+C。您只是误解了等待守护进程线程完成意味着什么。Finish意味着完全执行他们的
Runnable
的run
方法。它说他们在哪里生存?你的问题没有道理,如果我想让某个端口上的侦听器捕捉某些事件,该怎么办?听上去,一旦JVM退出,监听器就会被杀死,那么我会失去我的监听器吗?是的,如果JVM存在,你的程序就完成了,所有资源都被释放了,所以你不再监听任何端口。不过,这更像是一个系统编程问题。基本上,操作系统在进程退出时做什么。这并不是java特有的。在这个答案中,关于JCIP中的守护进程线程的一些附加细节:t.setDaemon(true)应该在t.start()之前;