为什么ForkJoinPool :: shutdownNow返回一个空列表?

时间:2019-04-26 10:39:38

标签: java java-8 executorservice

ExecutorService有一个方法

List<Runnable> shutdownNow()

其中

  

返回正在等待执行的任务的列表。

但是,ForkJoinPool始终返回Collection.emptyList()。从那以后,ForkJoinPool的实现

  

试图取消和/或停止所有任务,并拒绝所有随后提交的任务,

是否还应该返回已取消的任务列表?

1 个答案:

答案 0 :(得分:3)

为什么要清空列表?
该文档说明(强调是我的):

  

此方法同时取消现有和未执行的任务,   允许在存在任务依赖项的情况下终止。所以方法   总是返回一个空列表(与其他情况不同)   执行者)。

为什么?

因为ForkJoinPoolExecutorService的“特殊”实现。
它可能具有与执行的fork相关的某些任务依赖性。
例如,在下面的示例中,如果已停止提交的任务,您还希望子任务1和子任务2也终止:

simple example of fork join
因此,当您停止ForkJoinPool实例的任务时,将返回一个List,指示不再等待其他任务。这样,所有等待其他任务终止或当前正在处理的任务也将根据需要终止。
虽然我不确定该方法的返回值(我尚未找到有关此方法的线索)用于当前的实现。