【发布时间】: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() 没有立即终止一切,我该怎么办?在回滚数据库之前确保所有线程都停止执行的最佳方法是什么?
【问题讨论】:
-
如果你能确保你的线程响应
Thread.interrupt()然后shutdownNow应该停止所有。 -
@Kevin,是的,但是直到
shutdownNow()调用返回之后的某个时间,它们才会全部停止。
标签: java multithreading executorservice rollback