何时调用ShutdownHook?

时间:2013-01-31 14:56:19

标签: java multithreading runtime

我对Runtime.getRuntime().addShutdownHook()有疑问。

假设我在main中启动了两个Threads。两个线程都在处理一个集合List<String> commonColection

当我按Ctrl+C时,我想要保存此集合。我的问题是:在调用ShutdownHooks之前线程是否已停止,或者我是否需要显式终止我的线程并在此之后保存我的集合?

2 个答案:

答案 0 :(得分:1)

  

当虚拟机开始关闭序列时,它将启动   所有已注册的关闭钩子都以某种未指定的顺序挂起并让它们   同时运行。当所有钩子都完成后,它将运行   所有未经调整的终结器,如果已启用最终退出。   最后,虚拟机将停止。

来自:Oracle Docu

当我读到这篇文章时,你将不得不中止你的主题( Thread.abort!而是使用一些方法来优雅地结束它们!)并保存你的收藏。至少你必须确保保存正确的集合状态。

如果线程不是“无限”且没有守护,你可以让它们完成。但我不建议这样做,因为关闭钩子应该快速返回。

答案 1 :(得分:0)

shutdownHook()开始,您可以通过发信号停止线程来优雅地终止线程。否则,如果您的线程是daemon threads,那么JVM将不会等待它们完成。当您按ctrl + c时,它会在调用shutdownHook()后退出。请参阅此javadoc for daemon thread行为。