具有可变延迟的 ScheduledExecutorService

假设我有一个任务,它从java.util.concurrent.BlockingQueue中提取元素并处理它们。

public void scheduleTask(int delay, TimeUnit timeUnit)
{
    scheduledExecutorService.scheduleWithFixedDelay(new Task(queue), 0, delay, timeUnit);
}

如果频率可以动态更改,我如何安排/重新安排任务?

  • 这个想法是获取数据更新流,并将它们批量传播到GUI。
  • 用户应该能够改变更新的频率

答案 1

使用而不是 或 。然后,确保您的可调用实例在将来的某个时间点重新计划自身或新的可调用实例。例如:schedule(Callable<V>, long, TimeUnit)scheduleAtFixedRatescheduleWithFixedDelay

// Create Callable instance to schedule.
Callable<Void> c = new Callable<Void>() {
  public Void call() {
   try { 
     // Do work.
   } finally {
     // Reschedule in new Callable, typically with a delay based on the result
     // of this Callable.  In this example the Callable is stateless so we
     // simply reschedule passing a reference to this.
     service.schedule(this, 5000L, TimeUnit.MILLISECONDS);
   }  
   return null;
  }
}

service.schedule(c);

此方法避免了关闭并重新创建 .ScheduledExecutorService


答案 2

我不认为你可以改变固定利率延迟。我认为你需要使用schendule()来执行一次性操作,并在完成后再次执行调度(如果需要,可以修改超时)。


推荐