如何确保使用shutdownNow()停止所有线程?

时间:2018-09-20 17:51:07

标签: java multithreading executorservice rollback

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

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

  

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

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

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

如果shutdownNow()不能立即终止所有操作,该怎么办?在回滚数据库之前,确保所有线程已停止执行的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

  

shutdownNow()不能立即终止一切怎么办?

提交错误报告。然后修复您的代码,以使awaitTermination()调用从一开始就不会超时。要么,要么找出一种方法,将这些任务正在执行的操作转移到可以安全地终止的单独进程中。