планирование выполняемых задач в Java - PullRequest
8 голосов
/ 24 января 2010

Я отвечаю на интересный вопрос о том, как использовать ScheduledThreadPoolExecutor для повторяющейся задачи

Планирование этого объекта возвращает объект ScheduledFuture, который можно использовать для отмены следующего запуска задачи.

Стоит отметить, что само задание полностью отделено от расписания -

ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1);
ScheduledFuture nextSchedule = 
    executor.schedule(task, 60000, TimeUnit.MILLISECONDS);

where-

SomeTask task = new SomeTask();

Так что сама задача не знает расписание. Просьба сообщить, есть ли способ заставить задачу отменить и создать новое расписание для себя.

Спасибо

Ответы [ 2 ]

7 голосов
/ 24 января 2010

Нет причин, по которым задача не может ссылаться на ScheduledExecutorService и планировать сам запуск при необходимости:

// (Need to make variable final *if* it is a local (method) variable.)
final ScheduledExecutorService execService = Executors.newSingleThreadScheduledExecutor();

// Create re-usable Callable.  In cases where the Callable has state
// we may need to create a new instance each time depending on requirements.
Callable<Void> task = new Callable() {
  public Void call() {
    try {
      doSomeProcessing();
    } finally {
      // Schedule same task to run again (even if processing fails).
      execService.schedule(this, 1, TimeUnit.SECONDS);
    }
  }
}
4 голосов
/ 24 января 2010

Передайте executor заданию, чтобы оно могло выполнять с ним манипуляции:

SomeTask task = new SomeTask(executor);
...