为什么ShutdownHookThread'setDaemon true'

时间:2011-10-14 14:10:38

标签: java multithreading scala shutdown-hook

我最近需要向我的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之前退出)。或者daemon / not-daemon与shutdown hooks无关?

2 个答案:

答案 0 :(得分:4)

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

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

简而言之,“守护进程”语义与unix不同(在unix中它表示一个继续运行的线程)。

答案 1 :(得分:1)

在这里回答我自己的问题。

两部分:

  1. 为什么ShutdownHookThread使其新线程daemon = true?
  2. 如果关闭钩子线程是daemon = true,会发生什么?
  3. 数目:

    1. 这源于“Scala脚本”的要求(运行scala myfile.scala而不是先显式编译)。讨论here。它现在已更改(commit),因此ShutdownHookThread的未来版本将不会包含此代码。
    2. 我没有发现任何决定性因素,但实验上似乎并不重要。我认为这是有道理的,因为守护程序状态会影响JVM何时开始关闭,因此在关闭之后,守护程序状态应该无关紧要。