java - 为什么 ShutdownHookThread 'setDaemon true'

标签 java multithreading scala shutdown-hook

我最近需要为我的 Scala 应用程序添加一个关闭钩子(Hook),我发现 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
}

为什么要这样做?在我看来,您可能希望在关闭钩子(Hook)线程中使用相反的方法(即确保线程在关闭 jvm 之前退出)。还是守护进程/非守护进程与关闭 Hook 无关?

最佳答案

在 JVM 上,通常非守护线程会阻止 JVM 终止。一旦不再有任何非守护线程,JVM 将通过启动关闭正常终止。查看addShutdownHook javadoc了解更多信息。

启动关闭后,我不确定守护进程状态是否重要。在启动关闭之前,关闭 Hook 线程也不会启动。所以在这种情况下 t setDaemon true 可能是不必要的,但它也不会造成伤害。

所以简而言之,“守护进程”语义不同于 unix(在 unix 领域,它表示一个保持运行的线程)。

关于java - 为什么 ShutdownHookThread 'setDaemon true',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7768877/

相关文章:

java - 有这行代码和没有这行代码有什么区别? x = 5 之前的行;在 Starter() 方法中

scala - 如何在不具体化的情况下使用源队列并将其返回给调用者?

java - 没有鼠标的一天(Java 键盘快捷键)

java - Ionic 3 Android 的新 apk 不会更新。给出 "app not installed. The package appears to be corrupt"

java - 编译应用程序时出现问题 - React Native

c# - WCF服务停止处理调用15秒钟

c++ - 全局变量的顺序会改变 C++/OpenGL 中的性能

java - Callable 是如何工作的?可调用对象如何返回值?

Scala : Futures with map, flatMap 用于 IO/CPU 密集型任务

scala - Spark : how can i create local dataframe in each executor