我正在安排一项任务:
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()关闭执行程序服务,以便在某个时刻之后不启动任何可运行的服务器