最近,我需要向我拥有的Scala应用程序添加一个关闭挂钩,我发现Scala为此提供了一个名为ShutdownHookThread的帮助器。在其来源中,我注意到it sets the new thread to be a daemon thread。
def apply(body: => Unit): ShutdownHookThread = {
val t = new ShutdownHookThread(hookName()) {
override def run() = body
}
t setDaemon true // <--------- right here
runtime addShutdownHook t
t
}
为什么要这样做?在我看来,您可能想要关闭钩子线程中的相反内容(即,在关闭jvm之前确保该线程退出)。还是守护程序/非守护程序与关闭挂钩无关?
最佳答案
在JVM上,通常,非守护程序线程将阻止JVM终止。一旦不再有任何非守护进程线程,那么JVM将通过启动关闭来正常终止。有关更多信息,请参见addShutdownHook javadoc。
启动关闭后,我不确定守护程序状态是否重要。此外,在启动关机之前,不会启动关机钩子线程。因此,在这种情况下,t setDaemon true
可能是不必要的,但也不会造成伤害。
因此,简而言之,“守护程序”的语义不同于unix(在unix领域中,它表示不断运行的线程)。