【问题标题】:How to assure all threads are stopped with shutdownNow()?如何确保所有线程都使用 shutdownNow() 停止?
【发布时间】:2018-09-20 17:51:06
【问题描述】:

我正在使用 Java 的 ExecutorService 同时运行一些任务。我面临这种情况,我有多个线程更新我的数据库,如果它们中的任何一个抛出异常,我想停止所有正在运行的线程执行并回滚数据库。

我可以用 shutdownNow() 来做到这一点。但是文档中有一个警告:

此方法不等待主动执行的任务终止。 使用 awaitTermination 来做到这一点。

不过,普通的 ol shutdown() 方法也有同样的警告。而且我读到使用shutdown() 的首选方法是等待终止并在终止超时时调用shutdownNow(),例如:

executorService.shutdown();
try {
    executorService.awaitTermination(1000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e1) {
    executorService.shutdownNow();
}

如果shutdownNow() 没有立即终止一切,我该怎么办?在回滚数据库之前确保所有线程都停止执行的最佳方法是什么?

【问题讨论】:

标签: java multithreading executorservice rollback


【解决方案1】:

如果 shutdownNow() 没有立即终止一切,我该怎么办?

提交错误报告。然后修复您的代码,使awaitTermination() 调用从一开始就永远不会超时。要么这样,要么想办法把这些任务正在做的事情转移到一个你可以安全杀死的单独进程中。

【讨论】:

    猜你喜欢
    • 2015-04-15
    • 2011-09-11
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2015-09-18
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多