Future.cancel()不会取消ScheduledExecutorService的计划执行

abk*_*srv 6 java concurrency multithreading executorservice java.util.concurrent

我将任务安排为:

ScheduledExecutorService dataService = Executors.newScheduledThreadPool(1);
Future<?> dataTimerHandle = dataService.scheduleAtFixedRate(runnable, 100, freq, TimeUnit.MILLISECONDS);
Run Code Online (Sandbox Code Playgroud)

这工作正常,没有缺陷。

但是,当某个标志变为true用户操作时,便不再需要定期执行任务,而只需执行一次即可。然后,我尝试取消任务并仅提交一次,如下所示:

if(!dynamicUpdate) {
    dataTimerHandle.cancel(true); 
    dataTimerHandle = dataService.submit(runnable);
}
else { //Reschedule again:
    dataTimerHandle = dataService.scheduleAtFixedRate(runnable, 100, freq, TimeUnit.MILLISECONDS);
}
Run Code Online (Sandbox Code Playgroud)

但是似乎可运行对象仍在定期执行并且cancel()未按预期工作。是否有其他替代策略?

Raf*_*ele 2

这是预期的,因为您将取消命令发送到错误的句柄。当您调用时service.submit(),它会返回新创建的 future 的句柄,并且您不能使用相同的句柄向通过其他调用创建的 future 发送取消消息

显然,您可以通过关闭执行程序服务,sevice.shutdown()以在某一时刻后不启动任何提交的可运行程序