假设我使用ScheduledThreadPoolExecutor计划任务并获得Future。
我后来决定取消Future,并依赖 cancel 的返回值来触发一些清理操作。如果任务已经在运行,我不希望该任务被中断(所以我将 false 作为参数传递)。
取消的回报是否可靠?也就是说,是不可能的,如果取消返回“true”,那么任务实际上正在运行?
查看OpenJDK 8中的代码,看起来可能存在竞争条件,其中“取消”将任务的状态设置为CANCELED并返回true,但是跑步者已经可以通过“检查”开始执行。
据我所见,计算将被执行但结果未设置(这是好的)。但是,在我的情况下,“计算”有副作用所以我想知道我是否真的取消了它。
答案 0 :(得分:0)
cancel(boolean)
个州的javadoc
尝试取消执行此任务。 此尝试将失败如果 任务已经完成,已经取消,或者可以 因其他原因不能取消。
如果成功,则执行此任务 调用cancel时尚未启动,此任务永远不会运行。如果 任务已经开始,然后是
mayInterruptIfRunning
参数 确定执行此任务的线程是否应该是 因试图停止任务而中断。
强调我的。在所有未发生故障的情况下,呼叫将返回true
。因此,该方法可能返回true
并且您的任务正在运行。