重新启动ScheduledExecutorService计划任务的正确方法是什么?

时间:2010-02-16 09:57:04

标签: java timer

我有一个计划任务(以固定延迟执行运行),就像这样开始:

executoreService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS);

在每个循环开始时,我检查设置文件中的更改,然后我想重新启动任务。设置文件还包含间隔的长度(上面代码中的numOfSeconds)。

目前,我使用以下代码重新启动任务:

executoreService.shutdownNow();
try {
 while(!executoreService.awaitTermination(5, TimeUnit.SECONDS)){
  logger.debug("awaiting termintation");
 }
} catch (InterruptedException e) {
 logger.debug("interrupted, continuing", e);
}
// initialize startup parameters
init();
// start the main scheduled timer
executoreService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS);

我不确定这些API调用。重启任务的推荐方法是什么(可能有新的延迟)?

1 个答案:

答案 0 :(得分:17)

不,您不想或不需要关闭整个服务只是为了修改一项任务。而是使用从服务获得的ScheduledFuture对象来取消任务,然后安排一个新任务。

ScheduledFuture<?> future = executorService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS);
...
// to cancel it:
future.cancel(true);
// then schedule again

或者,为什么不直接使用新设置或参数更新repeatThread中的状态?如果你不需要新的延迟,它甚至不需要重新安排。