2012-10-08 125 views
2

顾名思义,我们有一个使用Executor服务安排守护程序的守护程序框架。在不终止服务的情况下更改ScheduledThreadPoolExecutorService的延迟

java.util.concurrent.ScheduledThreadPoolExecutor.scheduleWithFixedDelay(Runnable 
    command, long initialDelay, long delay, TimeUnit unit) 

在运行时,我想改变Runnable类的两个运行之间的延迟,而不终止我们的应用程序。

可能吗?如果是,如何?

+0

你为什么要这样做?当它不需要运行时,你可以不做任何事情吗? –

+0

我想根据其他参数更改计划。今天,我以2小时的间隔运行它,明天,我想每小时运行它(例如,我需要更多的计算,只是一个例子)。 – instanceOfObject

+0

因此,如果您每小时运行一次,并在需要时每隔两小时跳过一次,那么会这样做吗? –

回答

3

我不知道最小粒度提前

在您需要取消的时间表,然后重新添加同一案件。

private Future future = null; 
private long periodMS = 0; 

public void setPeriod(long periodMS) { 
    if (future != null && this.periodMS == periodMS) return; 
    if (future != null) future.cancel(false); 
    scheduledExecutorService.scheduleWithFixedDelay(task, periodMS/2, periodMS, TimeUnit.MILLI_SECONDS); 
} 

或者您可以使任务重新安排自己。

private long periodMS; 

public void start() { 
    scheduledExecutorService.schedule(this, periodMS, TimeUnit.MILLI_SECONDS); 
} 

public void run() { 
    try { 
     task.run(); 
    } catch(Exception e) { 
     // handle e 
    } 
    start(); 
} 

这种方式每次运行时都可以改变。

相关问题