0

我有一个关于Runtime.getRuntime().addShutdownHook().

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

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

4

2 回答 2

1

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

来自:Oracle 文档

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

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

于 2013-01-31T16:19:34.747 回答
0

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

于 2013-01-31T16:34:59.067 回答