2013-01-31 36 views
0

我有一个关于Runtime.getRuntime().addShutdownHook()的问题。当ShutdownHook被调用?

假设我有两个以main开头的线程。两个线程都在处理一个集合,即List<String> commonColection

当我按Ctrl+C我想保存这个集合。我的问题是:线程在ShutdownHooks被调用之前停止,还是需要显式终止我的线程,然后保存我的集合?

+0

我想当虚拟机启动它的关闭序列。它将注册所有关闭挂钩。 – MMK

回答

1

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

来源:Oracle Docu

当我读到这,你将不得不中止你的线程并保存您的收藏(Thread.abort而是使用一些手段来结束他们优雅!)。至少你必须确保你正在保存收集的适当状态。

如果线程不是“无限”而且没有deamons,你可以让它们完成。但我不会推荐这个,因为关机挂钩应该会很快返回。

0

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

相关问题