thread - timer.schedule java
¿Qué sucede si una tarea de Timer tarda más tiempo en ejecutarse que el intervalo especificado? (2)
Cuando usas
Timer.schedule(TimerTask task, long delay, long period)
(es decir, con la ejecución de retardo fijo), ¿qué sucede si el TimerTask
run()
TimerTask
especificado tarda más que un period
en completarse? ¿Es posible que se TimerTask
dos subprocesos TimerTask
simultáneos debido a esto? Y si es así, ¿hay alguna manera de evitarlo?
La documentation del temporizador dice lo siguiente:
Las tareas del temporizador deben completarse rápidamente. Si una tarea de temporizador tarda demasiado tiempo en completarse, "acapara" el hilo de ejecución de la tarea del temporizador. Esto puede, a su vez, retrasar la ejecución de las tareas subsiguientes, que pueden "agruparse" y ejecutarse en rápida sucesión cuando (y si) la tarea ofensiva finalmente se completa.
Es decir, los subprocesos de TimerTask
simultáneos no se ejecutarán. Las tareas se acumularán en una cola. Esto puede o no ser apropiado (más probable, no).
Timer
y TimerTask
no manejan bien este tipo de situaciones. Si quieres manejarlo mejor, entonces no uses esas clases.
java.util.concurrent.ScheduledExecutorService
proporciona dos métodos de programación, scheduleAtFixedRate
y scheduledWithFixedDelay
, que rigen lo que sucede cuando las tareas se "agrupan".
scheduleAtFixedRate
:
Crea y ejecuta una acción periódica que se habilita primero después del retraso inicial dado, y posteriormente con el período dado; es decir, las ejecuciones comenzarán después de initialDelay luego initialDelay + period, luego initialDelay + 2 * period, y así sucesivamente. Si alguna ejecución de la tarea encuentra una excepción, se eliminan las ejecuciones posteriores. De lo contrario, la tarea solo terminará a través de la cancelación o terminación del ejecutor. Si cualquier ejecución de esta tarea toma más tiempo que su período, las ejecuciones posteriores pueden comenzar tarde, pero no se ejecutarán simultáneamente.
scheduleWithFixedDelay
:
Crea y ejecuta una acción periódica que se habilita primero después de la demora inicial dada, y posteriormente con la demora dada entre la terminación de una ejecución y el comienzo de la siguiente. Si alguna ejecución de la tarea encuentra una excepción, se eliminan las ejecuciones posteriores. De lo contrario, la tarea solo terminará a través de la cancelación o terminación del ejecutor.
Puede crear instancias de ScheduledExecutorService
usando la clase de fábrica Executors
.