Подтвердить что ты не робот

Что произойдет, если TimerTask займет больше времени, чем указанный интервал?

При использовании

Timer.schedule(TimerTask task, long delay, long period)

(т.е. с выполнением с фиксированной задержкой), что произойдет, если указанный метод TimerTask run() займет больше времени period для завершения? Возможно ли, что из-за этого будут выполняться две параллельные потоки TimerTask? И если да, есть ли способ избежать этого?

4b9b3361

Ответ 1

Timer документация сообщает следующее:

Задачи таймера должны выполняться быстро. Если задача таймера занимает слишком много времени для завершения, она "свирепствует" поток выполнения задачи таймера. Это может, в свою очередь, задерживать выполнение последующих задач, которые могут "группироваться" и выполняться быстро, когда (и если) завершающая задача окончательно завершается.

То есть, параллельные потоки TimerTask не будут выполняться. Задачи будут накапливаться в очереди. Это может быть или не быть уместным (скорее всего, нет).

Ответ 2

Timer и TimerTask не справляются с такой ситуацией. Если вы хотите справиться с этим лучше, не используйте эти классы.

java.util.concurrent.ScheduledExecutorService предоставляет два метода планирования scheduleAtFixedRate и scheduledWithFixedDelay, которые определяют, что происходит, когда задачи "группируются".

scheduleAtFixedRate:

Создает и выполняет периодическое действие который становится включенным сначала после с учетом начальной задержки, а затем с данным периодом; то есть казни начнутся после initialDelay then initialDelay + period, затем initialDelay + 2 * period, и так на. Если какое-либо выполнение задачи встречает исключение, последующее казни подавляются. В противном случае, задача будет прекращаться только через отмена или прекращение исполнитель. Если какое-либо выполнение этого задача занимает больше времени, чем ее период, то последующие казни могут начаться поздно, но не будет одновременно выполнить.

scheduleWithFixedDelay:

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

Вы можете создавать экземпляры ScheduledExecutorService, используя класс Executors factory.