根据Javadocs,shutdown()将等待执行所有提交任务。我有两个问题:
答案 0 :(得分:1)
提交的任务是什么意思?这些任务是否必须由ExecutorService.submit()方法专门提交,还是包括ExecutorService.execute()方法提交的任务?
A'已提交'在这个意义上的任务是传递给ExecutorService的任何Runnable或Callable。尽管javadoc的措辞略有混淆,但它并不区分execute()
与submit()
。
我添加了一个调用ExecutorService.shutdown()的关闭钩子。根据文档,它应该等待执行所有提交任务。但是直到我在shutdown()调用之后添加awaitTermination()调用时才会这样做。为什么没有awaitTermination()调用它没有执行所有任务?
shutdown()操作是非阻塞(异步),因为几乎所有ExecutorService API上的方法都是如此。 javadoc仅声明调用shutdown()
将启动关闭序列。
这里的关键是ExecutorService将尝试等待所有任务完成,但如果shutdown()
是主方法终止前的最后一行代码,{{1}将在main方法结束后调用,该方法将终止JVM并覆盖ExecutorService尝试等待运行任务完成。我认为System.exit()
始终推迟ExecutorService.shutdown()
并希望选择加入阻止调用(即System.exit()
)是不可取的。