java – Future.cancel()没有取消ScheduledExecutorService的计划执行

我正在安排一项任务:

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

这没有缺陷,工作正常.

但是,当某个标志在用户操作中变为true时,该任务不再需要定期执行,并且只需执行一次.然后我尝试取消任务并按如下方式提交一次:

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

但似乎runnable仍然定期执行而cancel()没有按预期工作.
有替代策略吗?

最佳答案 这是预期的,因为您将取消命令发送到错误的句柄.当你调用service.submit()时,它返回一个新创建的未来的句柄,你不能使用相同的句柄来发送取消消息给通过其他调用创建的未来

显然你可以通过sevice.shutdown()关闭执行程序服务,以便在某个时刻之后不启动任何可运行的服务器

点赞