【问题标题】: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。

        【讨论】:

          猜你喜欢
          • 2013-10-12
          • 2013-01-04
          • 1970-01-01
          • 2017-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-24
          相关资源
          最近更新 更多