[英]Does Future.cancel(true) remove the task from the queue?
我对Future.cancel(true)
的行为有点困惑。 如果它已经在运行,它确实会interrupt
任务,但是那些尚未启动的任务呢? 他们确实被取消了,但他们是否从队列中删除? 在Stackoverflow
我发现了矛盾的答案:
有人可以解释实际行为吗?
在表示常用ThreadPoolExecutor
作业的期货的情况下,取消的任务不会立即从队列中删除,如方法purge()
所示:
purge()
尝试从工作队列中删除所有已取消的
Future
任务。 此方法可用作存储回收操作,对功能没有其他影响。 取消的任务永远不会执行,但可能会在工作队列中累积,直到工作线程可以主动删除它们。 现在调用此方法会尝试删除它们。 但是,这种方法可能会在存在其他线程干扰的情况下无法删除任务。
在CompletableFuture
情况下,没有明确说明,但由于CompletableFuture
在Executor
抽象上运行并且根本无法控制实现,我们可以假设它不会从任何队列中删除取消的作业。 但是,如果在取消时未满足先决条件(即,当您使用asyncJob.thenApplyAsy(…, someExecutor)
并在asyncJob
完成之前取消它时),则该作业可能不会首先入队。
唯一可靠的信息来源是官方文档,即Future#cancel描述。 它说实现应该尝试从队列中删除任务,但没有义务这样做。 由于Future
是一个接口,我们可能期望不同的实现有不同的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.