首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >主退出后恶魔线程继续运行,还有一些非守护进程线程还在运行吗?

主退出后恶魔线程继续运行,还有一些非守护进程线程还在运行吗?
EN

Stack Overflow用户
提问于 2018-05-11 17:33:32
回答 3查看 965关注 0票数 1

我知道所有的恶魔线程都是在主出口之后终止的。但是,如果有一些非守护进程线程在main退出后继续运行,该怎么办?此非守护进程线程的运行是否阻止所有其他守护进程线程终止?

主退出后恶魔线程继续运行,还有一些非守护进程线程还在运行吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-11 18:04:38

守护进程线程在JVM终止之前不会关闭。

只要没有线程调用System.exit,并且任何非守护进程线程仍在运行,JVM就不会终止。

因此,是的,运行非守护进程线程可以阻止JVM关闭,而且只要JVM还活着,它就不会强制守护进程线程终止。

来自Java语言规范,12.8程序出口

当以下两种情况之一发生时,程序终止其所有活动并退出:

  • 所有不是守护进程线程的线程都会终止。
  • 一些线程调用类运行时或类系统的退出方法,安全管理器不禁止退出操作。

因此,请注意确保您的线程正确关闭。在一个项目中,我有一个定期写入文件的后台线程,我试图弄清楚为什么文件的内容会发生剧烈的变化。其原因是后台线程没有被关闭,所以它停留在周围,继续做它的事情,即使新启动的应用程序也在写入文件。执行ps -af | grep java显示,有2个java进程运行在本应有一个进程的地方。

票数 0
EN

Stack Overflow用户

发布于 2018-05-11 17:44:29

当所有非守护进程线程停止时,运行库将关闭。因此,如果启动另一个非守护进程线程,如事件队列,应用程序将继续运行。

票数 0
EN

Stack Overflow用户

发布于 2018-05-11 17:37:56

为什么不自己检查呢??

代码语言:javascript
运行
复制
public static void main(String[] ...){
Thread t1=new Thread(()=>{for(;;);});
t1.setDeamon(true);

Thread t2=new Thread(()=>{for(;;){System.out.println(new Date())}});
t2.setDeamon(false);

t1.start();
t2.start();
Thread.currentThread().sleep(1000);
}

并检查JVM是否终止。如果您的CPU 100%繁忙,则不会。

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

https://stackoverflow.com/questions/50297456

复制
相关文章

相似问题

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