[英]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.