Java 守护进程线程在JVM退出后如何生存?

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就会退出

我正在阅读关于Java的
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()之前;