Элегантное нелинейное планирование задач? - PullRequest
0 голосов
/ 22 июня 2011

Я хотел бы запланировать, чтобы задача выполнялась сначала часто, а потом реже. Я бы предпочел не добавлять зависимость в Quartz только для этого.

Со стандартной библиотекой Java лучшее, что я придумал, - это серия одноразовых задач, за которыми следует менее частое линейное расписание:

    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
    myRunnable = new MyRunnable();
    executor.schedule( myRunnable, 0, TimeUnit.SECONDS );
    executor.schedule( myRunnable, 5, TimeUnit.SECONDS );
    executor.schedule( myRunnable, 10, TimeUnit.SECONDS );
    executor.schedule( myRunnable, 15, TimeUnit.SECONDS );
    executor.schedule( myRunnable, 30, TimeUnit.SECONDS );
    executor.schedule( myRunnable, 45, TimeUnit.SECONDS );
    executor.scheduleWithFixedDelay( myRunnable, 60, 300, TimeUnit.SECONDS );

Есть ли более элегантный подход?

Ответы [ 2 ]

5 голосов
/ 22 июня 2011

Вы можете позволить задаче запускать свое следующее выполнение и всегда увеличивать несколько секунд ожидания после каждого завершения?

2 голосов
/ 22 июня 2011

В качестве дополнения к тому, что предложил @dcn, вы можете написать делегирующий класс, который выполняет планирование:

public class NonLinearScheduling {

  public static void taperingOffSchedule(final ScheduledExecutorService executor,
                                         final Runnable task,
                                         final long initialDelay,
                                         final TimeUnit unit,
                                         final double decayMultiplier) {
    assert initialDelay > 0;
    assert decayMultiplier > 1.0;
    Runnable repeater = new Runnable() {
        double nextDelay = initialDelay;
        public void run() {
            task.run();
            nextDelay *= decayMultiplier;
            executor.schedule(this, (long) nextDelay, unit);
        }
    };
    executor.schedule(repeater, initialDelay, unit);
  }
}

Обратите внимание, что вместо repeater, являющегося анонимным Runnable, он может стать общеизвестным типом, который позволяет отменять будущее планирование и т. Д .:

public interface Repeater extends Runnable {
  void stopRepeating();
}


public class NonLinearScheduling {
  public static Repeater taperingOffSchedule(...) { ... }

  private static class NonLinearRepeater implements Repeater {
    private final AtomicBoolean _repeat = new AtomicBoolean(true);

    public void stopRepeating() {
      _repeat.set(false);
    }

    public void run() {
      if (_repeat.get()) {
        ...          
      }
    }
  }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...