如果线程成功,注销sys.ShutdownHookThread?

Unregister sys.ShutdownHookThread if thread is successful?

我在 Scala 2.11 中有一个 Future,它由 Akka 中的工人 actor 控制。 Future 由 worker 执行,worker 向中央 actor 报告 success/failure 并请求更多工作。

worker 处理的期货是 long-运行,根据任务的复杂性,计算最多可能需要 15 分钟才能完成。有 100% 的机会在计算中期进行部署,我将让它崩溃。但是,我确实需要做一些非常小的清理工作,所以我在未来自己实现了以下 sys.ShutdownHookThread

sys.ShutdownHookThread {
  logger.info(s"Computation was killed mid-task for user ${set.userId}. Recovering state...")
  closeProcessingState
}

我的问题是这样的:如果我已经注册了一个关闭钩子,它会在 future 完成后自行注销吗?检查 API 文档,描述说它是 "self-unregistering" 但它似乎没有说明是什么原因导致它自行注销。

基本上,如果 JVM 在数小时后关闭,我不想要一千个关闭挂钩 运行,因为它们不会自动注销。

文档没有说它是 "self-unregistering"。它说:It knows how to unregister itself.。这意味着您可以在 ShutdownHookThread.

的实例中调用方法 remove

这个ShutdownHookThread只是java.lang.Runtime#addShutdownHook. Have a look at the implementation it's quite simple的帮手。

换句话说,您有责任取消注册。