Интервал ThreadPoolScheduler меньше времени выполнения задачи - PullRequest
2 голосов
/ 15 января 2012

Я использую Spring ThreadPoolTaskScheduler для выполнения несинхронизированного метода каждые 5 минут. Иногда выполнение метода занимает более 5 минут. Я попытался наблюдать за поведением в таком сценарии, и кажется, что метод не выполняется снова, пока текущее выполнение не будет завершено (даже если 5-минутный интервал закончился).

Хотя это подходит для того, чего я хочу достичь, но мне интересно, почему второй поток не создается через 5 минут для выполнения метода параллельно тому, который занимает более 5 минут. Сначала я подумал, что это связано с размером пула, который по умолчанию равен 1. Однако даже когда я увеличил размер пула, поведение остается прежним.

Я попытался углубиться в код ThreadPoolScheduler, и оказалось, что внутри он запускает задачу через ThreadPoolExecutor. Предназначен ли он для запуска только одного потока, который ожидает завершения одного выполнения, прежде чем запустить другой, даже если интервал прошел?

Что касается кода, это то, что я делаю -

<task:scheduler id="scheduler" pool-size="1" />


 scheduler.scheduleAtFixedRate(new Runnable() {
  public void run() {
     executeThis(); // this takes more than 5 minutes sometime
  }
 }, 5*60*1000);

С уважением,

Tushar

Ответы [ 2 ]

4 голосов
/ 15 января 2012

Второй поток не создается, потому что он нарушит контракт метода, указанного в его javadoc :

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

Это поведение является задокументированным, задокументированным поведением.

3 голосов
/ 15 января 2012

Ваш размер пула равен 1, то есть через 5 минут он отправляет новое задание - однако нет потока, доступного для его выполнения.Таким образом, задача ожидает завершения исходного потока, а затем планирует новую задачу.Увеличьте размер пула, если задачу нужно запускать с фиксированным интервалом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...