ExecutorService中的awaitTermination"是否发生在"之前之后执行的任何代码?

时间:2014-03-26 15:10:03

标签: java concurrency threadpool threadpoolexecutor

请帮助理解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()之后放置的任何代码都池中的最后一个任务完成后发生。

感谢。

2 个答案:

答案 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.

无法准确停止运行线程,因此您必须等待已经运行的任务完成。