usar scheduleatfixedrate newscheduledthreadpool example ejemplo como java scheduled-tasks scheduledexecutorservice

java - scheduleatfixedrate - scheduledexecutorservice example



scheduleAtFixedRate versus scheduleWithFixedDelay (4)

Hay una trampa en scheduleAtFixedRate si el primer hilo tarda demasiado y no termina en una duración determinada, entonces el segundo hilo no se iniciará una vez que la primera tarea se terminará y no se iniciará inmediatamente mientras que el primer hilo ha completado su tarea y la duración de Gievn ha sido transcurrido. JVM decidirá cuándo se ejecutará la próxima tarea.

Creo que eso te ayudará a elegir el método porque debido a esto tengo un gran problema

¿Cuál es la principal diferencia entre scheduleWithFixedDelay métodos scheduleAtFixedRate y scheduleWithFixedDelay de ScheduledExecutorService ?

scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("scheduleAtFixedRate: " + new Date()); } }, 1, 3L , SECONDS); scheduler.scheduleWithFixedDelay(new Runnable() { @Override public void run() { System.out.println("scheduleWithFixedDelay: " + new Date()); } }, 1, 3L , SECONDS);

imprimen exactamente al mismo tiempo, parece que se ejecutan exactamente en el mismo intervalo.


Intente agregar un Thread.sleep(1000); llame dentro de su método run() ... Básicamente es la diferencia entre programar algo en función de cuándo finaliza la ejecución previa y cuándo (lógicamente) comienza .

Por ejemplo, supongamos que programo que una alarma suene con una frecuencia fija de una vez por hora, y cada vez que se apaga, tomo una taza de café, lo que demora 10 minutos. Supongamos que comienza a la medianoche, tendría:

00:00: Start making coffee 00:10: Finish making coffee 01:00: Start making coffee 01:10: Finish making coffee 02:00: Start making coffee 02:10: Finish making coffee

Si programo con un retraso fijo de una hora, tendría:

00:00: Start making coffee 00:10: Finish making coffee 01:10: Start making coffee 01:20: Finish making coffee 02:20: Start making coffee 02:30: Finish making coffee

Cuál de las dos depende de tu tarea.


Si lees el Java Doc, será más claro

ScheduledFuture scheduleAtFixedRate (Comando Runnable, Long initialDelay, long period, TimeUnit unit) Crea y ejecuta una acción periódica que se habilita primero después de la demora inicial dada, 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.

ScheduledFuture scheduleWithFixedDelay (comando Runnable, long initialDelay, long delay, TimeUnit unit) 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 finalización de una ejecución y el comienzo de la siguiente.


Visualice la serie de tiempo del método de invocación scheduleAtFixedRate . Las próximas ejecuciones comenzarán de inmediato si la última toma más tiempo que el período. De lo contrario, comenzará después de la hora del período.

Serie de scheduleWithFixedDelay método de invocaciónWithFixedDelay. La próxima ejecución comenzará después del tiempo de demora entre la finalización de una ejecución y el comienzo de la siguiente, independientemente de su tiempo de ejecución

Hope puede ayudarte