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