我想等待所有线程被执行,然后才继续。
ExecutorService es = Executors.newFixedThreadPool(3);
List<Callable<Void>> calls = new LinkedList<>();
Arrays.stream(new int[]{1,2,3})
.forEach( i -> calls.add(() -> {
someFunc(i);
return null;
}));
try {
es.invokeAll(calls);
} catch (InterruptedException e) {
e.printStackTrace();
}
es.shutdown();
System.out.println(es.isTerminated()); //prints false
System.out.println(es.isShutdown()); //prints true
为什么我两个案件都没有true
?
我的所有主题都已成功终止。
答案 0 :(得分:3)
查看isTerminated
的文档突出了差异:
如果关闭后所有任务都已完成,则返回
true
。 请注意,isTerminated()
永远不会true
,除非 首先调用shutdown()
或shutdownNow()
。@return
true
如果关闭后所有任务都已完成
因此,在您的情况下,这意味着执行程序已关闭但您的任务未完成。
答案 1 :(得分:2)
而不是使用shutdown,你可以使用thread.join来等待所有线程已经完成以后用普通线程关闭。 在你的情况下,使用ExecutorService,在关机后,你需要执行taskExecutor.awaitTermination来等待尚未完成的其他任务。
try {
es.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
...
}
答案 2 :(得分:0)
线程执行程序的关闭过程包括首先拒绝提交给它的任何新任务 线程执行器,同时继续执行任何先前提交的任务。在这段时间, 调用isShutdown()将返回true,而isTerminated()将返回false。
自从您致电es.shutDown()
以来,es.isShutdown()
返回true。但是,当您到达es.isTerminated()
时,由es.invokeAll(calls)
开始的任务仍在执行。因此isTerminated()
返回false。