如果线程成功,取消注册sys.ShutdownHookThread?

时间:2015-12-02 19:51:47

标签: multithreading scala akka shutdown-hook

我在Scala Future中有一个2.11,由Akka的一名工作人员控制。未来由工人执行,工人向中央行为者报告,报告成功/失败并要求更多工作。

工作人员处理的期货是长期运行的,根据任务的复杂程度,计算可能需要15分钟才能完成。在计算中期部署可能会有100%的可能性,我只是让它崩溃。但是,我确实需要进行一些非常小的清理工作,所以我将来会实现以下sys.ShutdownHookThread

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

我的问题是这样的:如果我已经注册了一个关闭钩子,它将在未来完成时取消注册吗?检查API文档时,描述说它是“自我取消注册”但它似乎并不表示是什么原因导致它自行注销。

基本上,如果JVM在几小时后关闭,我不希望运行一千个关闭挂钩,因为它们没有自我注销。

1 个答案:

答案 0 :(得分:2)

文档并没有说它是"自我注销"。它说:It knows how to unregister itself.。这意味着您可以在remove

的实例中调用方法ShutdownHookThread

ShutdownHookThread只是java.lang.Runtime#addShutdownHook的帮手。看看实施it's quite simple

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