请帮助理解ExecutorService#awaitTermination(timeout)行为。
我在我的代码中观察情况:
private void shutdownAndAwaitTermination(ExecutorService threadPool){
threadPool.shutdown();
try {
if (!threadPool.awaitTermination(threadPoolTimeout, TimeUnit.HOURS)){
threadPool.shutdownNow();
if (!threadPool.awaitTermination(60, TimeUnit.SECONDS)) {
logger.warn("Pool did not terminate");
}
}
}
catch (InterruptedException ie) {
threadPool.shutdownNow();
Thread.currentThread().interrupt();
}
}
在同一个线程中,在shutdownAndAwaitTermination()之后的任何其他调用>>之前,池中的任务是否完成?
调查生产过程中发生了什么,我认为答案是没有,但我只是想了解如何确保调用shutdownAndAwaitTermination()之后放置的任何代码都在池中的最后一个任务完成后发生。
感谢。
答案 0 :(得分:1)
不,从shutdownAndAwaitTermination()
方法返回后,任务肯定可以完成,因为您实际上没有等待终止。如果等待的线程被中断,或者它花费的时间太长,即使任务可能仍在运行,您也会停止等待。
即使您拨打shutdownNow()
,您的任务也可能无法响应中断(通常,ExecutorService
无法保证使用中断)。所以任务可能仍在运行。
如果你想确保在从这个方法返回之前完成任务完成,你必须继续尝试,直到awaitTermination()
返回true
,尽管有中断等。这将是一个糟糕的设计,所以如果你的任务通过Future
返回结果而不是非原子地产生副作用会更好。这样,可以对可以成功完成的任务执行操作,而可以忽略未完成的任务。
答案 1 :(得分:0)
来自http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html:
List<Runnable> shutdownNow
Attempts to stop all actively executing tasks, halts the processing of waiting tasks,
and returns a list of the tasks that were awaiting execution.
This method does not wait for actively executing tasks to terminate.
Use awaitTermination to do that.
无法准确停止运行线程,因此您必须等待已经运行的任务完成。