ExecutorService awaitTermination被卡住了

22

我使用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 上卡住了,有什么问题吗?


请问您能展示一下您的线程池声明吗? - Omnaest
11
您需要先调用shutdown才能使exec服务终止。 - Peter Štibraný
将字符串作为参数从一个Java应用程序传递给另一个应用程序的方法:https://dev59.com/ilfUa4cB1Zd3GeqPJI0y - mKorbel
2个回答

34

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

来源: javadoc


那么,如果我想要保持重复使用线程池,我应该使用invokeAll,并不断检查Future列表直到它们全部完成? - Kevin
这是正确的 - awaitTermination 仅在关闭上下文中使用。 - Paul Bellora
1
@kevin:invokeAll 只有在所有任务都完成(无论是正常完成还是异常完成)后才会返回。在这种情况下,您需要检查 Futures 来获取结果,而不是查看它们是否已经完成(它们已经完成)。 - Peter Štibraný
@Peter,你说得完全正确。我错误地认为invokeAll不会阻塞。 - Kevin
@Peter - 很好的发现。根据他的代码,我认为这就是他想要实现的。 - Paul Bellora

2
你还可以使用ExecutorService#invokeAll。它会阻塞,直到所有任务都完成或达到超时时间。如果你的ExecutorService包含其他任务,特别是定时任务,使用它比使用shutdown更加干净。因为调用shutdown也会影响这些任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接