Что произойдет, если TimerTask займет больше времени, чем указанный интервал?
При использовании
Timer.schedule(TimerTask task, long delay, long period)
(т.е. с выполнением с фиксированной задержкой), что произойдет, если указанный метод TimerTask
run()
займет больше времени period
для завершения? Возможно ли, что из-за этого будут выполняться две параллельные потоки TimerTask
?
И если да, есть ли способ избежать этого?
Ответы
Ответ 1
Timer документация сообщает следующее:
Задачи таймера должны выполняться быстро. Если задача таймера занимает слишком много времени для завершения, она "свирепствует" поток выполнения задачи таймера. Это может, в свою очередь, задерживать выполнение последующих задач, которые могут "группироваться" и выполняться быстро, когда (и если) завершающая задача окончательно завершается.
То есть, параллельные потоки TimerTask
не будут выполняться. Задачи будут накапливаться в очереди. Это может быть или не быть уместным (скорее всего, нет).
Ответ 2
Timer
и TimerTask
не справляются с такой ситуацией. Если вы хотите справиться с этим лучше, не используйте эти классы.
java.util.concurrent.ScheduledExecutorService
предоставляет два метода планирования scheduleAtFixedRate
и scheduledWithFixedDelay
, которые определяют, что происходит, когда задачи "группируются".
scheduleAtFixedRate
:
Создает и выполняет периодическое действие который становится включенным сначала после с учетом начальной задержки, а затем с данным периодом; то есть казни начнутся после initialDelay then initialDelay + period, затем initialDelay + 2 * period, и так на. Если какое-либо выполнение задачи встречает исключение, последующее казни подавляются. В противном случае, задача будет прекращаться только через отмена или прекращение исполнитель. Если какое-либо выполнение этого задача занимает больше времени, чем ее период, то последующие казни могут начаться поздно, но не будет одновременно выполнить.
scheduleWithFixedDelay
:
Создает и выполняет периодическое действие который становится включенным сначала после с учетом начальной задержки, а затем с данной задержкой между прекращение одного исполнения и начало следующего. Если выполнение задачи встречает исключение, последующие казни подавлено. В противном случае задача будет только прекращается путем аннулирования или завершение работы исполнителя.
Вы можете создавать экземпляры ScheduledExecutorService
, используя класс Executors
factory.