tick thread stop metodo alarma java multithreading timer

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 .