Java 为什么ShutdownHookThread';setDaemon true';

Java 为什么ShutdownHookThread';setDaemon true';,java,multithreading,scala,shutdown-hook,Java,Multithreading,Scala,Shutdown Hook,我最近需要在我拥有的一个Scala应用程序中添加一个关机钩子,我发现Scala为这个应用程序提供了一个助手。在它的来源中,我注意到了这一点 def应用(主体:=>Unit):ShutdownHookThread={ val t=新的ShutdowHookThread(hookName()){ 覆盖def run()=主体 } t setDaemon true/在JVM上,通常非守护进程线程会阻止JVM终止。一旦不再存在任何非守护进程线程,JVM将通过启动关机正常终止。有关更多信息,请参阅 一旦启

我最近需要在我拥有的一个Scala应用程序中添加一个关机钩子,我发现Scala为这个应用程序提供了一个助手。在它的来源中,我注意到了这一点

def应用(主体:=>Unit):ShutdownHookThread={
val t=新的ShutdowHookThread(hookName()){
覆盖def run()=主体
}

t setDaemon true/在JVM上,通常非守护进程线程会阻止JVM终止。一旦不再存在任何非守护进程线程,JVM将通过启动关机正常终止。有关更多信息,请参阅

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


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

回答我自己的问题

两部分:

  • 为什么
    shutdownhokthread
    使其新线程守护进程=true
  • 如果关闭挂钩线程是daemon=true,会发生什么
  • 答复:

  • 这源于对“Scala脚本编写”(运行
    Scala myfile.Scala
    而不是首先显式编译)的要求。讨论。它现在已被更改(),因此
    ShutdownHookThread
    的未来版本将不会有此代码
  • 我还没有发现任何决定性的东西,但从实验上看,这似乎无关紧要。我认为这是有意义的,因为守护进程状态会影响JVM何时开始关闭,所以在关闭已经开始之后,守护进程状态就不重要了

  • 不知道为什么,这在框架中作为默认值是一个坏主意。您可以质疑它,因为普通的Java语言关闭钩子并没有daemonize。但是我同意daemonize应该是应用程序开发人员的选择(如果他最了解这个线程想要实现什么,并且真的想要这种行为,我不在乎我是否运行)。因此,为了确保这是一个100%的错误,你需要澄清JVM是否/如何在关闭时序列化ShutdownHooks。如果他们序列化run/join,那么设置Daemonize总是一个错误。谢谢你的回答。你说“一般来说,守护进程线程将阻止JVM终止”。我的理解正好相反(基于)。如果应用程序中只剩下守护进程线程,JVM将退出。因此,如果主(非守护进程)线程结束,并且您的关闭挂钩为daemon=true,您可以在运行之前退出。除非启动关闭后这些都不重要。@overthink,是的,完全是一个错误。刚刚修复,所以现在第一句话实际上与第二句话一致!感谢您的更正。关于您的最后一句话,我确实这么认为。”一旦启动关机,这些都不重要”。我想这将需要测试或谷歌确认。我想这可能是一个拼写错误。谢谢澄清!
    def apply(body: => Unit): ShutdownHookThread = {
      val t = new ShutdownHookThread(hookName()) {
        override def run() = body
      }
      t setDaemon true  // <--------- right here
      runtime addShutdownHook t
      t
    }