Мне было интересно узнать о конкретном случае ScheduledExecutorService в java.

Позволять,

ScheduledExecutorService = new ScheduledThreadPoolExecutor(2);

service.scheduleAtFixedRate(new Runnable() {

 @Override
 public void run() {
      //Some task taking longer than schedule period to finish executing.
 }

},initialDelay,period,TimeUnit.SECONDS);

В этом случае, скажем, период составляет 4 секунды. Когда расписание начинает выполняться после начальной задержки, задача будет заблокирована внутри цикла while (true) в бесконечном цикле. Мой вопрос: через каждые 4 секунды задача будет запланирована без учета выполнения (незавершенного) предыдущего раунда задачи? Потому что, если это так, этот код в конечном итоге выйдет из строя после нехватки памяти.

Помощь приветствуется.

Спасибо.

-4
Nowa Concordia 3 Янв 2018 в 09:46

1 ответ

Лучший ответ

Из javadoc scheduleAtFixedRate():

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

Это означает, что задача будет запущена один раз, но, поскольку она никогда не завершится, других вызовов не будет. Вы просто потратите один поток в пуле.

То же самое применимо к scheduleWithFixedDelay(), поскольку задержка отсчитывается с момента завершения предыдущего выполнения (и поскольку оно не завершается, следующее выполнение не может произойти).

2
Kayaman 3 Янв 2018 в 06:53