我有一个关于Runtime.getRuntime().addShutdownHook()
的问题。当ShutdownHook被调用?
假设我有两个以main开头的线程。两个线程都在处理一个集合,即List<String> commonColection
。
当我按Ctrl+C
我想保存这个集合。我的问题是:线程在ShutdownHooks被调用之前停止,还是需要显式终止我的线程,然后保存我的集合?
我有一个关于Runtime.getRuntime().addShutdownHook()
的问题。当ShutdownHook被调用?
假设我有两个以main开头的线程。两个线程都在处理一个集合,即List<String> commonColection
。
当我按Ctrl+C
我想保存这个集合。我的问题是:线程在ShutdownHooks被调用之前停止,还是需要显式终止我的线程,然后保存我的集合?
当虚拟机开始关闭序列,它会以某种未指定的顺序启动 所有已注册的关闭挂钩,并让它们同时运行 。当所有挂钩完成后,它将运行 所有未引用的终结器,如果已启用终止退出。 最后,虚拟机将停止。
来源:Oracle Docu
当我读到这,你将不得不中止你的线程并保存您的收藏(不Thread.abort
而是使用一些手段来结束他们优雅!)。至少你必须确保你正在保存收集的适当状态。
如果线程不是“无限”而且没有deamons,你可以让它们完成。但我不会推荐这个,因为关机挂钩应该会很快返回。
从你的shutdownHook()
你可以优雅地通过发信号停止你的线程来终止你的线程。否则,如果你的线程是daemon threads
,那么JVM不会等待它们完成。当您按ctrl + c时,它会在拨打shutdownHook()
后退出。请参阅此javadoc for daemon thread行为。
我想当虚拟机启动它的关闭序列。它将注册所有关闭挂钩。 – MMK