【问题标题】:ExecutorService awaitTermination gets stuckExecutorService awaitTermination 卡住了
【发布时间】:2011-10-26 21:52:46
【问题描述】:

我用Executors.newFixedThreadPool(2)做了一个固定大小的线程池,我执行了10个Runnable对象。我设置断点并跟踪执行。但是,即使所有任务都已完成,fixedSizeThreadPool.awaitTermination() 也不允许我继续。

基本上:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(2);
for (int i = 0; i < 10; ++i) {
    fixedSizeThreadPool.execute(myRunables[i]);
}
try {
    fixedSizeThreadPool.awaitTermination(timeout, timeoutUnits);
} catch (Exception e) { }
System.out.println("done!");

但这总是卡在awaitTermination。怎么了?

【问题讨论】:

标签: java multithreading executorservice java.util.concurrent


【解决方案1】:

正如彼得指出的那样,必须首先调用shutdown()

来源:javadoc

【讨论】:

  • 所以如果我想继续重用线程池,我应该使用invokeAll,并继续检查Futures列表直到它们全部完成?
  • 没错 - awaitTermination 仅用于关闭它的上下文中
  • @kevin:invokeall 仅在所有任务完成后才返回,无论是正常还是异常。在这种情况下,您检查 Futures 以获得结果,而不是查看它们是否已完成(他们已完成)。
  • @Peter 你是绝对正确的。我错误地认为 invokeAll 没有阻塞。
  • @Peter - 不错。根据他的代码,我认为这是他想要实现的目标。
【解决方案2】:

您也可以使用ExecutorService#invokeAll。它会阻塞,直到所有任务完成或达到超时。如果您的 ExecutorService 包含其他任务以及特别是计划任务,它比使用shutdown 更干净一些。这些也会受到对shutdown 的调用的影响。

【讨论】:

    猜你喜欢
    • 2015-02-02
    • 2012-06-23
    • 2021-10-08
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多