java - main 退出后,守护线程继续运行,并且有一些非守护线程仍在运行?

标签 java

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

main退出后,守护线程继续运行,并且有一些非守护线程仍在运行?

最佳答案

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

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

所以,是的,运行的非守护线程会阻止 JVM 关闭,并且只要 JVM 处于 Activity 状态,它就不会强制守护线程终止。

来自the Java Language Specification, 12.8 Program Exit :

A program terminates all its activity and exits when one of two things happens:

  • All the threads that are not daemon threads terminate.

  • Some thread invokes the exit method of class Runtime or class System, and the exit operation is not forbidden by the security manager.

因此请小心确保您的线程正确关闭。在一个项目中,我有一个后台线程定期写入文件,我试图弄清楚为什么文件的内容发生了巨大的变化。事实证明,原因是后台线程没有关闭,因此它停留在周围并继续执行其操作,即使新启动的应用程序也在写入文件。做ps -af | grep java显示本应有 1 个的地方有 2 个 java 进程在运行。

关于java - main 退出后,守护线程继续运行,并且有一些非守护线程仍在运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50297456/

相关文章:

java - 为 Spring MVC Controller - AOP 或 Spring Security 的方法传递密码?

java - 如何让我的游戏在 libgdx 中十秒后停止?

java - 为什么在 Netbeans 中输入 mysql 查询很困难?

java - 我们可以使用 java 访问(打开-读/写)驱动程序文件/dev/aaa 吗?

java - ArrayDeque vs LinkedList as Queue 进行层序遍历

java - 如何为我的 Web 应用程序创建具有自动完成功能的所见即所得代码编辑器?

java - CF8 SSL 连接到 Postgres 失败

java - android SQLite 方法故障(?!?!)

java - Spring mvc Controller 返回Collection(set, list),jsp将其用作数组

java - 使用 If 语句中定义的变量?