Quelle est la principale différence entre scheduleAtFixedRate
et les scheduleWithFixedDelay
méthodes 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);
ils impriment exactement au même moment, semblent être exécutés exactement au même intervalle.
Visualisez la série chronologique de la
scheduleAtFixedRate
méthode d' appel . Les prochaines exécutions commenceront immédiatement si la dernière prend plus de temps que la période. Sinon, il démarrera après la période.Série chronologique de la
scheduleWithFixedDelay
méthode d' appel . La prochaine exécution commencera après un délai entre la fin d'une exécution et le début de la suivante, indépendamment de son heure d'exécutionL'espoir peut vous aider
la source
La
scheduleAtFixedRate()
méthode crée une nouvelle tâche et la soumet à l'exécuteur à chaque période, que la tâche précédente soit terminée ou non .D'autre part, la
scheduleWithFixedDelay()
méthode crée une nouvelle tâche une fois la tâche précédente terminée .la source
scheduleAtFixedRate
:)Si vous lisez le Java Doc, ce sera plus clair
ScheduledFuture scheduleAtFixedRate (Commande exécutable, long initialDelay, longue période, unité TimeUnit) Crée et exécute une action périodique qui devient activée en premier après le délai initial donné, puis avec la période donnée; c'est-à-dire que les exécutions commenceront après initialDelay puis initialDelay + period, puis initialDelay + 2 * period, et ainsi de suite.
ScheduledFuture scheduleWithFixedDelay (commande Runnable, long initialDelay, long delay, TimeUnit unit) Crée et exécute une action périodique qui devient activée d'abord après le délai initial donné, puis avec le délai donné entre la fin d'une exécution et le début de la suivante.
la source
Il y a un problème dans scheduleAtFixedRate si le premier thread prend trop de temps et n'est pas terminé dans une durée donnée, le second thread conscutif ne démarrera pas une fois que la première tâche sera terminée et ne démarrera pas immédiatement tant que le premier thread a terminé sa tâche et sa durée s'est écoulé. JVM décidera quand la prochaine tâche sera exécutée.
Je pense que cela vous aidera à choisir la méthode car à cause de cela, j'ai un gros problème
la source
ScheduledThreadPoolExecutor
(et ce dernier a un comportement bien défini)Écrivons un programme simple:
Et voyez les résultats:
AVIS le temps d'exécution est plus long que l'attente
scheduleWithFixedDelay conserve le délai de
programmationAtFixedRate supprime le délai
la source
Exécutez-le simplement et vous saurez la différence. Je vous remercie
la source