【问题标题】:Difference between executor terminate and shutdown执行器终止和关闭之间的区别
【发布时间】:2017-11-02 14:58:59
【问题描述】:
我想等待我的所有线程都被执行,然后才继续。
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?
我的所有线程都已成功终止。
【问题讨论】:
标签:
java
multithreading
parallel-processing
【解决方案1】:
查看isTerminated 的文档突出了不同之处:
如果所有任务在关闭后都已完成,则返回 true。
请注意,isTerminated() 永远不会是 true,除非两者之一
shutdown() 或 shutdownNow() 被首先调用。
@return true 如果所有任务在关机后都已完成
因此,在您的情况下,这意味着执行程序已关闭,但您的任务未完成。
【解决方案2】:
您可以使用 thread.join 来等待所有线程已完成,然后使用普通线程关闭,而不是使用关闭。
在您的情况下,使用 ExecutorService,在关机后,您需要执行 taskExecutor.awaitTermination 以等待其他任务尚未完成。
try {
es.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
...
}
【解决方案3】:
线程执行器的关闭过程首先包括拒绝任何提交给
线程执行器,同时继续执行任何先前提交的任务。在这段时间,
调用 isShutdown() 将返回 true,而 isTerminated() 将返回 false。
由于您调用了es.shutDown(),es.isShutdown() 返回 true。但是当您到达es.isTerminated() 时,es.invokeAll(calls) 启动的任务仍在执行中。因此isTerminated() 返回 false。