shutdown()后需要ExecutorService.awaitTermination()

时间:2016-12-27 07:15:04

标签: java multithreading executorservice

根据Javadocs,shutdown()将等待执行所有提交任务。我有两个问题:

  • 提交的任务是什么意思?这些任务是否必须由ExecutorService.submit()方法专门提交,还是包括ExecutorService.execute()方法提交的任务?
  • 我添加了一个调用ExecutorService.shutdown()的关闭钩子。根据文档,它应该等待执行所有提交任务。但是直到我在shutdown()调用之后添加awaitTermination()调用。为什么不在没有awaitTermination()调用的情况下执行所有任务?

1 个答案:

答案 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())是不可取的。