繁体   English   中英

java ExecutorService.awaitTermination() 是否阻塞主线程并等待?

[英]Does java ExecutorService.awaitTermination() block the main thread and wait?

我有这个测试代码:

    ExecutorService executor = Executors.newFixedThreadPool(3);
    executor.execute(new Runnable() {
      @Override
      public void run() {
        try {
          System.out.println("run begins");
          Thread.sleep(1000);
          System.out.println("run ends");
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    });
    try {
      executor.awaitTermination(0L, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    executor.shutdown();
    System.out.println("-----------");

我预计,因为 Runnable 应该休眠 1s 然后结束,然后执行程序等待它的终止和关闭,最后是System.out.println("-----------"); 被执行。

但真正的输出是:

-----------
run begins
run ends

执行顺序对我来说没有多大意义。 似乎 ExecutorService.awaitXXX 和 shutdown() 不会阻塞主线程。 System.out.println("-----------"); 是要打印的第一行代码,然后是 Runnable 代码。

这是设计的行为吗?

如果是,那么我的问题是:如果 awaitXXXX 方法没有阻塞主线程,那么主线程如何知道ExecutorService何时完成?

似乎 ExecutorService.awaitXXX 和 shutdown() 不会阻塞主线程

方法awaitTermination()确实会阻塞调用线程,但您已将超时时间指定为0秒。 引用javadoc

在关闭请求后阻塞,直到所有任务都完成执行,或者发生超时,或者当前线程被中断,以先发生者为准。

如果您期望awaitTermination()会中断提交的任务,那么您的期望是错误的,它不会那样做。 此方法仅允许您指定等待时间并报告执行程序是否已完成。

返回:如果此执行程序终止,则返回 true;如果在终止前超时,则返回 false

方法shutdown()不会中断之前提交的任何任务:

启动有序关闭,其中执行先前提交的任务,但不会接受新任务。

如果您想尝试中断提交的任务,请使用shutdownNow()

尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。

注意:使用shutdown()是首选方法。

来自ExecutorService#awaitTermination的 Javadocs

在关闭请求阻塞,直到所有任务都完成执行

这意味着awaitTermination只会在关闭请求之后工作,因此您需要在awaitTermination() shutdown() ) 。

此外,正如@Alexander Ivanchenko 的另一个回答所提到的,将超时设置为 0L 将不会等待任何内容,并且awaitTermination指示线程是否通过返回值及时终止。 如果您的主线程被另一个线程InterruptedException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM