为什么ShutdownHookThread'setDaemon true'

ove*_*ink 4 java multithreading scala shutdown-hook

我最近需要向我拥有的Scala应用程序添加一个关闭挂钩,并且我发现Scala为此提供了一个名为ShutdownHookThread的帮助器。在其源代码中,我注意到它将新线程设置为守护程序线程。

def apply(body: => Unit): ShutdownHookThread = {
  val t = new ShutdownHookThread(hookName()) {
    override def run() = body
  }
  t setDaemon true  // <--------- right here
  runtime addShutdownHook t
  t
}
Run Code Online (Sandbox Code Playgroud)

为什么要这样做?在我看来,您可能想要关闭钩子线程中的相反内容(即,确保在关闭jvm之前退出该线程)。还是守护程序/非守护程序与关闭挂钩无关?

huy*_*hjl 5

在JVM上,通常,非守护程序线程将阻止JVM终止。一旦不再有任何非守护进程线程,那么JVM将通过启动关闭来正常终止。有关更多信息,请参见addShutdownHook javadoc。

启动关闭后,我不确定守护程序状态是否重要。此外,在启动关机之前,不会启动关机钩子线程。因此在这种情况下t setDaemon true可能是不必要的,但也不会造成伤害。

因此,简而言之,“守护程序”的语义不同于unix(在unix领域中,它表示不断运行的线程)。