【问题标题】:Daemon And Non-Daemon Threads In JavaJava中的守护线程和非守护线程
【发布时间】:2020-12-02 05:17:56
【问题描述】:
Java 中的JVM 负责在执行Java 程序时创建一个非守护线程。这是对的吗?
如果是这样,谁负责在 Java 中创建守护线程?
程序员和 JVM 都创建非守护线程?这是对的吗?
寻求明确的解释。
提前致谢。
【问题讨论】:
标签:
multithreading
jvm
virtual-machine
daemon
【解决方案1】:
“JVM”或“程序员”是否启动线程并不重要。当一个线程在启动之前已经调用了setDaemon(true) 或者一个守护线程在没有调用setDaemon 的情况下创建了该线程时,该线程就是一个守护线程。就是这样。
documentation of Thread 还说:
当 Java 虚拟机启动时,通常有一个非守护线程(通常调用某个指定类的名为 main 的方法)。
没有责任创建守护线程。将线程标记为守护进程只有一个含义,文档将继续解释:
Java 虚拟机继续执行线程,直到发生以下任一情况:
-
Runtime 类的 exit 方法已被调用,安全管理器已允许执行退出操作。
- 不是守护线程的所有线程都已死亡,要么从对
run 方法的调用返回,要么抛出传播到 run 方法之外的异常。
所以,这是唯一的含义;非守护线程的存在可能会阻止 JVM 自动终止,而标记为守护线程的线程则不会。