我正在使用Java的ExecutorService
来同时运行一些任务。我面临这种情况,我有多个线程更新我的数据库,如果其中任何一个引发异常,我想停止所有正在运行的线程执行并回滚数据库。
我可以用shutdownNow((来做到这一点。但是文档中有一个警告:
此方法不会等待主动执行的任务终止。 使用 awaitTerminate 来执行此操作。
不过,普通的 olshutdown()
方法也有同样的警告。我读过使用shutdown()
的首选方法是等待终止并在终止超时时调用shutdownNow()
,例如:
executorService.shutdown();
try {
executorService.awaitTermination(1000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e1) {
executorService.shutdownNow();
}
那么,如果shutdownNow()
没有立即终止所有内容,我该怎么办?在回滚数据库之前确保所有线程都已停止执行的最佳方法是什么?
如果shutdownNow((没有立即终止所有内容,我该怎么办?
提交错误报告。 然后修复您的代码,以便awaitTermination()
调用永远不会超时。 要么这样,要么想办法将这些任务正在做的任何事情转移到一个单独的过程中,你可以安全地杀死。