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

Max*_*hka 5 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,池中的任务是否在同一线程中的shutdownAndAwaitTermination()之后的任何其他调用之前完成?

看看生产中发生了什么,我认为答案是否定的,但我只想了解如何确保在调用shutdownAndAwaitTermination()之后放置的任何代码都将在池中的最后一个任务完成后发生.

谢谢.

eri*_*son 3

不,任务肯定可以在您从shutdownAndAwaitTermination()方法返回后完成,因为您实际上并不等待终止。如果等待线程被中断,或者花费的时间太长,您将停止等待,即使任务可能仍在运行。

即使您调用shutdownNow(),您的任务也可能不会响应中断(并且通常ExecutorService不保证使用中断)。因此任务可能仍在运行。

如果你想确保任务完成发生在从这个方法返回之前,你必须继续尝试直到awaitTermination()返回true,尽管有中断等。这将是一个糟糕的设计,所以如果你的任务通过一个返回结果会更好Future而不是非原子地产生副作用。这样,可以对成功完成的任务执行操作,而可以忽略未完成的任务。