¿Cuál es la principal diferencia entre los 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.
java
scheduled-tasks
scheduledexecutorservice
Aserrador
fuente
fuente
Visualice series de tiempo del
scheduleAtFixedRate
método de invocación . Las siguientes ejecuciones comenzarán inmediatamente si la última lleva más de un período. De lo contrario, comenzará después del período de tiempo.Serie temporal del
scheduleWithFixedDelay
método de invocación . La siguiente ejecución comenzará después del tiempo de demora entre la terminación de una ejecución y el comienzo de la siguiente, independientemente de su tiempo de ejecución.La esperanza puede ayudarte
fuente
El
scheduleAtFixedRate()
método crea una nueva tarea y la envía al ejecutor cada período, independientemente de si la tarea anterior terminó o no .Por otro lado, el
scheduleWithFixedDelay()
método crea una nueva tarea una vez finalizada la anterior .fuente
scheduleAtFixedRate
:)Si lee Java Doc, será más claro
ScheduledFuture scheduleAtFixedRate (Comando ejecutable, retraso inicial largo, período largo, unidad TimeUnit) Crea y ejecuta una acción periódica que se habilita primero después del retraso inicial dado, y luego con el período dado; es decir, las ejecuciones comenzarán después de initialDelay, luego initialDelay + período, luego initialDelay + 2 * período, y así sucesivamente.
ScheduledFuture scheduleWithFixedDelay (comando ejecutable, retraso inicial largo, retraso largo, unidad TimeUnit) Crea y ejecuta una acción periódica que se habilita primero después del retraso inicial dado, y posteriormente con el retraso dado entre la terminación de una ejecución y el comienzo de la siguiente.
fuente
Hay un problema en scheduleAtFixedRate si el primer hilo está tardando demasiado y no finaliza en una duración determinada, entonces el segundo hilo consecutivo no se iniciará una vez que la primera tarea haya finalizado y no se iniciará inmediatamente mientras el primer hilo haya completado su tarea y haya alcanzado la duración ha transcurrido. JVM decidirá cuándo se ejecutará la siguiente tarea.
Creo que eso te ayudará a elegir el método porque debido a esto tengo un gran problema
fuente
ScheduledThreadPoolExecutor
(y este último tiene un comportamiento bien definido)Escribamos un programa simple:
Y mira los resultados:
AVISO el tiempo de ejecución es mayor que esperar
scheduleWithFixedDelay mantiene la demora
scheduleAtFixedRate elimina la demora
fuente
Simplemente ejecútelo y sabrá la diferencia. Gracias
fuente