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()未按预期工作。是否有其他替代策略?
这是预期的,因为您将取消命令发送到错误的句柄。当您调用时service.submit(),它会返回新创建的 future 的句柄,并且您不能使用相同的句柄向通过其他调用创建的 future 发送取消消息
显然,您可以通过关闭执行程序服务,sevice.shutdown()以在某一时刻后不启动任何提交的可运行程序
| 归档时间: |
|
| 查看次数: |
7837 次 |
| 最近记录: |