Java 未来方法取消返回值的可靠性(假)

Java 未来方法取消返回值的可靠性(假),java,future,Java,Future,假设我使用ScheduledThreadPoolExecutor调度一个任务,并获得一个未来 我后来决定取消该未来,并依靠cancel的返回值触发一些清理操作。如果任务已经在运行,我不希望它被中断(因此我将false作为参数传递) 取消的返回是否可靠?也就是说,如果cancel返回“true”,任务实际上正在运行,这是不可能的吗 查看OpenJDK 8中的代码,看起来可能存在争用条件,即“取消”将任务的状态设置为已取消并返回true,但运行程序可能已经通过了“检查”以开始执行 据我所见,将执行计

假设我使用ScheduledThreadPoolExecutor调度一个任务,并获得一个未来

我后来决定取消该未来,并依靠cancel的返回值触发一些清理操作。如果任务已经在运行,我不希望它被中断(因此我将false作为参数传递)

取消的返回是否可靠?也就是说,如果cancel返回“true”,任务实际上正在运行,这是不可能的吗

查看OpenJDK 8中的代码,看起来可能存在争用条件,即“取消”将任务的状态设置为已取消并返回true,但运行程序可能已经通过了“检查”以开始执行


据我所见,将执行计算,但结果未设置(这很好)。然而,在我的例子中,“计算”有副作用,所以我想知道我是否真的取消了它。

取消(布尔值)的javadoc声明

试图取消此任务的执行如果发生以下情况,此尝试将失败 该任务已完成、已取消或可能无法执行 不能因为其他原因取消

如果成功,此任务 调用cancel时未启动,此任务不应运行。如果 任务已启动,则
可能中断fRunning
参数 确定执行此任务的线程是否应 在试图停止任务时被中断


我的。在所有非故障的情况下,调用将返回
true
。因此,该方法可能返回
true
,并且您的任务正在运行。

确实如此。在深入研究代码之前,我应该仔细阅读文档。你能用我需要的语义给一个类提供建议吗?否则,我会自己滚。谢谢。@FabioT。我不知道有什么不同的API可以实现这一点,但如果可能的话,您可能需要重新考虑其副作用。