成为守护线程是什么意思?

5

我完全了解将线程标记为守护线程对JVM退出的影响(如果所有非守护线程退出,则JVM将退出)。

将线程设置为守护线程是否有其他副作用?

(完全无关,只是语义上的问题,守护线程的含义在这种情况下不是相反的吗:例如,如果我编写自己的HTTP守护进程并启动它运行,我不想让JVM保持活动状态直到该线程存活吗?或者这个术语“守护进程”有其他语义吗?)


2
通常情况下,您会同时运行守护线程和非守护线程:非守护线程正在执行有用的工作,但是守护线程只是坐在那里等待事件发生。在完成有用的工作后,程序应该退出;您不希望被什么都不做的线程阻塞。在您的示例中,HTTP 守护进程是一个守护进程 进程,而不是守护线程。可以想象一台桌面电脑,在没有非守护进程运行时关闭,您不希望服务器保持其开启。(或者也许您希望...无论如何,这不是最好的名称。) - David Z
是的 - 我非常了解这种行为,并经常利用它。我完全随意的旁白只是想问问其他人是否同意这个名称很令人困惑 :) - Jared
1
这并不是很困惑,守护进程被期望永远不会退出——在程序运行时始终运行,因为它们从来没有真正退出,所以它们不应该阻止程序本身退出。 - Bill K
2个回答

4
你所理解的意思是线程已分离并将在JVM运行时长运行,除非你明确停止它。按规定,只要有任何非daemon线程正在运行,JVM就会保持运行状态。
除此之外,它没有太大的意义。
你可以认为这是反过来的——毕竟,shutdown(8)会杀死daemon进程——但JVM应该像一个行为良好的进程一样运行,这意味着人们应该能够期望它在不需要被杀死的情况下终止。因此,这个规范是基于更常见的用例设计的决策。

3

守护线程是为其他线程提供服务的线程。它只是对于jvm本身而言才是守护进程,而不是对于外部世界。因此,如果只有守护进程存在,它们就没有更多用处了。如果你想要一个http守护进程,你只需编写一个带有正常线程的http服务器,并使用操作系统的工具集将其作为守护进程调用。

总之,在jvm中,守护线程并不是操作系统中的守护线程。守护线程通常是无限循环,当所有正在运行的仅为等待输入的一些守护进程时,您不希望您的jvm继续无限运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接