我最近需要为我拥有的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无关?
解决方法:
在JVM上,通常非守护程序线程将阻止JVM终止.一旦不再有任何非守护程序线程,JVM将通过启动关闭来正常终止.有关详细信息,请参阅addShutdownHook javadoc.
一旦启动关闭,我不确定守护程序状态是否重要.在启动关闭之前,也不会启动关闭挂钩线程.所以在这种情况下,t setDaemon可能是不必要的,但它也不会受到伤害.
所以简而言之,“守护进程”语义与unix不同(在unix中它表示一个继续运行的线程).
原文地址:https://codeday.me/bug/20190621/1252826.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。