我对Runtime.getRuntime().addShutdownHook()
有疑问。
假设我在main中启动了两个Threads。两个线程都在处理一个集合List<String> commonColection
。
当我按Ctrl+C
时,我想要保存此集合。我的问题是:在调用ShutdownHooks之前线程是否已停止,或者我是否需要显式终止我的线程并在此之后保存我的集合?
答案 0 :(得分:1)
当虚拟机开始关闭序列时,它将启动 所有已注册的关闭钩子都以某种未指定的顺序挂起并让它们 同时运行。当所有钩子都完成后,它将运行 所有未经调整的终结器,如果已启用最终退出。 最后,虚拟机将停止。
来自:Oracle Docu
当我读到这篇文章时,你将不得不中止你的主题(不 Thread.abort
!而是使用一些方法来优雅地结束它们!)并保存你的收藏。至少你必须确保保存正确的集合状态。
如果线程不是“无限”且没有守护,你可以让它们完成。但我不建议这样做,因为关闭钩子应该快速返回。
答案 1 :(得分:0)
从shutdownHook()
开始,您可以通过发信号停止线程来优雅地终止线程。否则,如果您的线程是daemon threads
,那么JVM将不会等待它们完成。当您按ctrl + c时,它会在调用shutdownHook()
后退出。请参阅此javadoc for daemon thread行为。