执行程序终止和关闭之间的区别

时间:2017-11-02 14:59:00

标签: java multithreading parallel-processing

我想等待所有线程被执行,然后才继续。

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

我的所有主题都已成功终止。

3 个答案:

答案 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。