Jaka jest główna różnica między scheduleAtFixedRate
i scheduleWithFixedDelay
metodami usługi 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);
drukują dokładnie w tym samym czasie, wydaje się, że są wykonywane dokładnie w tym samym czasie.
Wizualizuj szeregi czasowe
scheduleAtFixedRate
metody wywołania . Kolejne egzekucje rozpoczną się natychmiast, jeśli ostatnia potrwa dłużej niż okres. W przeciwnym razie rozpocznie się po upływie określonego czasu.Szeregi czasowe
scheduleWithFixedDelay
metody wywołania . Kolejna realizacja rozpocznie się po czasie opóźnienia między zakończeniem jednej realizacji a rozpoczęciem następnej, niezależnie od czasu jej wykonaniaHope może ci pomóc
źródło
scheduleAtFixedRate()
Metoda tworzy nowe zadanie i przekazuje go do realizatora każdy okres, niezależnie od tego, czy poprzednie zadanie zakończone .Z drugiej strony
scheduleWithFixedDelay()
metoda tworzy nowe zadanie po zakończeniu poprzedniego zadania .źródło
scheduleAtFixedRate
:)Jeśli przeczytasz dokument Java, będzie to jaśniejsze
ScheduledFuture scheduleAtFixedRate (polecenie Runnable, long initialDelay, long period, timeUnit) Tworzy i wykonuje okresowe działanie, które jest włączane najpierw po zadanym początkowym opóźnieniu, a następnie w zadanym okresie; to znaczy, że wykonanie rozpocznie się po initialDelay, a następnie initialDelay + okres, a następnie initialDelay + 2 * okres i tak dalej.
ScheduledFuture scheduleWithFixedDelay (Runnable command, long initialDelay, long delay, TimeUnit unit) Tworzy i wykonuje okresowe działanie, które jest włączane najpierw po zadanym początkowym opóźnieniu, a następnie z zadanym opóźnieniem między zakończeniem jednego wykonania a rozpoczęciem następnego.
źródło
Jest jeden haczyk w scheduleAtFixedRate, jeśli pierwszy wątek trwa zbyt długo i nie został zakończony w podanym czasie, drugi kolejny wątek nie rozpocznie się po zakończeniu pierwszego zadania i nie rozpocznie się natychmiast, gdy pierwszy wątek zakończy swoje zadanie i uzyska czas trwania upłynął. JVM Zdecyduje, kiedy zostanie wykonane następne zadanie.
Myślę, że pomoże ci to wybrać metodę, ponieważ z tego powodu mam duży problem
źródło
ScheduledThreadPoolExecutor
(a ten ostatni ma dobrze zdefiniowane zachowanie)Napiszmy prosty program:
I zobacz wyniki:
UWAGA czas wykonania jest dłuższy niż czekanie
scheduleWithFixedDelay utrzymuje opóźnienie
scheduleAtFixedRate usuwa opóźnienie
źródło
Po prostu wykonaj to, a poznasz różnicę. Dziękuję Ci
źródło