gpt4 book ai didi

java - ExecutorService "happens-before"中的 awaitTermination 是否在其后执行任何代码?

转载 作者:搜寻专家 更新时间:2023-10-31 20:34:24 25 4
gpt4 key购买 nike

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

谢谢。

最佳答案

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

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

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

关于java - ExecutorService "happens-before"中的 awaitTermination 是否在其后执行任何代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22665198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com