有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个计划任务(在固定延迟执行中运行),启动方式如下:

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) 个答案

  1. # 1 楼答案

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

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

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