首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在JVM退出之后,守护进程线程是如何生存的?

在JVM退出之后,守护进程线程是如何生存的?
EN

Stack Overflow用户
提问于 2015-07-06 17:38:55
回答 1查看 7.4K关注 0票数 11

我正在阅读关于Java的setDaemon()方法的文档,当我不等待守护进程线程完成而读取JVM退出时,我感到困惑。

但是,由于守护进程线程本质上是Java的Thread,它可能依赖于JVM来实现其功能,如果JVM在守护进程线程完成之前退出,守护进程线程如何生存呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-06 17:41:33

他们活不下去。JVM将在除守护进程之外的所有线程都死掉时退出。

启动应用程序时,JVM将启动一个非守护进程线程来运行静态主方法。

一旦主方法退出,这个主线程就会死掉,如果您没有生成其他非守护进程线程,JVM就会退出。

但是,如果您启动了另一个线程,JVM将不会退出,它将等待所有非守护进程线程在退出之前死亡。

如果你所生成的线程正在做一些至关重要的事情,这绝对是正确的,不管你经常有一些线程不是那么重要,也许它们是在听一些可能发生或不可能发生的外部事件。

因此,理论上,您应该在某个地方放置一些代码来停止您生成的所有线程,以允许JVM退出。

因为这很容易出错,所以标记像守护进程这样的非重要线程就更容易了。如果它们被标记为这些线程,JVM将不会等待它们在退出之前死亡,JVM将在“主线程”(那些未标记为守护进程的线程)死后退出并杀死这些线程。

要将其放入代码中,如下所示:

代码语言:javascript
运行
复制
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。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31252227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档