2

顾名思义,我们有一个守护进程框架,它使用 Executor 服务来调度守护进程。

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

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

是否可以?如果是,如何?

4

1 回答 1

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();
}

这样,周期可以在每次运行时更改。

于 2012-10-08T08:37:11.807 回答