Was ist der Hauptunterschied zwischen scheduleAtFixedRate
undscheduleWithFixedDelay
Methoden von 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);
Sie drucken genau zur gleichen Zeit und scheinen genau im gleichen Intervall ausgeführt zu werden.
Visualisieren Sie Zeitreihen der Aufrufmethode
scheduleAtFixedRate
. Die nächsten Ausführungen beginnen sofort, wenn die letzte länger als die Dauer dauert. Andernfalls wird es nach Ablauf der Zeit gestartet.Zeitreihen der Aufrufmethode
scheduleWithFixedDelay
. Die nächste Ausführung beginnt nach der Verzögerungszeit zwischen der Beendigung einer Ausführung und dem Beginn der nächsten, unabhängig von ihrer AusführungszeitHoffnung kann dir helfen
quelle
Die
scheduleAtFixedRate()
Methode erstellt eine neue Aufgabe und sendet sie in jedem Zeitraum an den Executor, unabhängig davon, ob die vorherige Aufgabe abgeschlossen wurde oder nicht .Andererseits erstellt die
scheduleWithFixedDelay()
Methode eine neue Aufgabe, nachdem die vorherige Aufgabe abgeschlossen wurde .quelle
scheduleAtFixedRate
:)Wenn Sie das Java-Dokument lesen, wird es klarer
ScheduledFuture ScheduleAtFixedRate (ausführbarer Befehl, lange Anfangsverzögerung, langer Zeitraum, TimeUnit-Einheit) Erstellt eine periodische Aktion und führt sie aus, die erst nach der angegebenen anfänglichen Verzögerung und anschließend mit dem angegebenen Zeitraum aktiviert wird. Das heißt, die Ausführung beginnt nach initialDelay, dann nach initialDelay + period, dann nach initialDelay + 2 * und so weiter.
ScheduledFuture ScheduleWithFixedDelay (Runnable-Befehl, Long InitialDelay, Long Delay, TimeUnit-Einheit) Erstellt und führt eine periodische Aktion aus, die erst nach der angegebenen Anfangsverzögerung und anschließend mit der angegebenen Verzögerung zwischen der Beendigung einer Ausführung und dem Beginn der nächsten aktiviert wird.
quelle
Es gibt einen Haken in ScheduleAtFixedRate. Wenn der erste Thread zu lange dauert und nicht in der angegebenen Dauer beendet wird, startet der zweite fortlaufende Thread nicht, sobald die erste Aufgabe abgeschlossen ist, und startet nicht sofort, während der erste Thread seine Aufgabe und die angegebene Dauer erreicht hat wurde abgelaufen. JVM entscheidet, wann die nächste Aufgabe ausgeführt wird.
Ich denke, das wird dir helfen, die Methode zu wählen, weil ich aus diesem Grund ein großes Problem habe
quelle
ScheduledThreadPoolExecutor
(und letzterer hat ein genau definiertes Verhalten)Schreiben wir ein einfaches Programm:
Und sehen Sie die Ergebnisse:
HINWEIS Die Ausführungszeit ist länger als das Warten
ScheduleWithFixedDelay behält die Verzögerung bei
ScheduleAtFixedRate entfernt die Verzögerung
quelle
Führen Sie es einfach aus, und Sie werden den Unterschied kennen. Danke dir
quelle