繁体   English   中英

Future.cancel(true) 是否从队列中删除任务?

[英]Does Future.cancel(true) remove the task from the queue?

我对Future.cancel(true)的行为有点困惑。 如果它已经在运行,它确实会interrupt任务,但是那些尚未启动的任务呢? 他们确实被取消了,但他们是否从队列中删除? Stackoverflow我发现了矛盾的答案:

不从队列中移除任务

是否从队列中删除任务

有人可以解释实际行为吗?

在表示常用ThreadPoolExecutor作业的期货的情况下,取消的任务不会立即从队列中删除,如方法purge()所示:

purge()

尝试从工作队列中删除所有已取消的Future任务。 此方法可用作存储回收操作,对功能没有其他影响。 取消的任务永远不会执行,但可能会在工作队列中累积,直到工作线程可以主动删除它们。 现在调用此方法会尝试删除它们。 但是,这种方法可能会在存在其他线程干扰的情况下无法删除任务。

CompletableFuture情况下,没有明确说明,但由于CompletableFutureExecutor抽象上运行并且根本无法控制实现,我们可以假设它不会从任何队列中删除取消的作业。 但是,如果在取消时未满足先决条件(即,当您使用asyncJob.thenApplyAsy(…, someExecutor)并在asyncJob完成之前取消它时),则该作业可能不会首先入队。

唯一可靠的信息来源是官方文档,即Future#cancel描述。 它说实现应该尝试从队列中删除任务,但没有义务这样做。 由于Future是一个接口,我们可能期望不同的实现有不同的行为。

暂无
暂无

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

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