我最近需要向我拥有的 Scala 应用程序添加一个关闭钩子,我发现 Scala 为此提供了一个帮助程序,称为关闭钩子线程 http://www.scala-lang.org/api/2.9.0/index.html#scala.sys.ShutdownHookThread。在其来源中我注意到它将新线程设置为守护线程 https://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_9_0_final/src//library/scala/sys/ShutdownHookThread.scala#L35.
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 http://download.oracle.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29了解更多信息。
一旦启动关闭,我不确定守护进程状态是否重要。此外,在启动关闭之前,关闭挂钩线程不会启动。所以在这种情况下t setDaemon true
可能是不必要的,但也不会造成伤害。
简而言之,“守护进程”语义与 unix 不同(在 unix 领域,它表示持续运行的线程)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)