Поведение Java ScheduledExecutorService.scheduleAtFixedRate () - PullRequest
7 голосов
/ 17 января 2012

У меня есть вопрос по поводу метода scheduleAtFixedRate () в ScheduledExecutorService в Java 6.

[ edit : Javadoc для 1.6 является более полным, чем для 1.5. Смотрите комментарий ниже]

Учитывая, что:

  • Служба ScheduledExecutorService создается с потоком N = 1 в пуле
  • Фиксированная ставка - это период Т секунд
  • без начальной задержки

Что происходит в этом случае (времена не должны быть абсолютными в смысле реального времени):

  • в момент времени T служба запускает запускаемую задачу "task1"
  • в момент времени 2T, задание 1 еще не выполнено, и служба запланирована к запуску

Сервис гарантированно выполняет любое из следующих действий?

  • (а) в 2T, запустить Runnable задачу, "task2" (вспомним N = 1)
  • (b) блок до завершения задачи 1
  • (c) пропустите это время и попробуйте снова в 3T
  • (d) поведение не определено

Или что-то еще? Меняется ли ответ, если N> 1?

Ответы [ 2 ]

7 голосов
/ 17 января 2012

Ответ

(b) блок до завершения задачи 1

и это независимо от количества потоков исполнителя (задача 2 может даже не быть отправлена).

Док говорит:

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

(Кстати, поскольку нет начальной задержки, «task1» сразу же начнется как показано:

выполнение начнется после initialDelay

).

1 голос
/ 17 января 2012

Из документации, которую вы связали ...

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

...