2010-02-16 126 views
9

我有一个计划任务(在固定延迟执行中运行),开始是这样的:什么是重新启动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调用。推荐重新启动任务的方式是什么(可能会有新的延迟)?

回答

13

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

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

另外,为什么不更新状态在任何repeatThread与新的设置或参数?如果你不需要新的延迟,它甚至不需要重新安排。

+0

这是一件需要考虑的事情,但它更容易实现将覆盖设置更改的任何情况。即设置文件中的任何变化*可能*也会改变延迟。因此,不是检查延迟是否发生了变化,然后做一件事,如果不是那样的话,那么我宁愿在任何情况下重新启动。 – Ovesh 2010-02-16 10:32:30

相关问题