Z zadań Timer do zaplanowanych executorów
Zastąp Timer i TimerTask za pomocą ScheduledExecutorService dla solidnej pracy zaplanowanej.
Timer timer = new Timer("refresh-timer");
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
refresh();
}
}, 0, 60_000);
ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(2);
scheduler.scheduleAtFixedRate(
this::refresh, 0, 1, TimeUnit.MINUTES);
Lepsza izolacja
Konfigurowalna pula wątków zapobiega dzieleniu jednego kruchego workera przez niepowiązane harmonogramy.
Solidne wykonanie
Niepowodzenie jednego zadania nie kończy działania samego schedulera.
Kontrolowany cykl życia
Future, anulowanie, opóźnienia i zamykanie korzystają ze standardowych API executorów.
Szeroko dostępne od JDK 5 (wrz. 2004)
Timer wykonuje każde zadanie na jednym wątku, więc długo działające zadanie opóźnia inne, a nieobsłużony wyjątek kończy działanie wątku timera. ScheduledExecutorService korzysta z frameworka executorów, obsługuje wielu workerów, zwraca uchwyty ScheduledFuture i zapewnia jawne zarządzanie cyklem życia. Komponent właścicielski musi zamknąć scheduler, gdy nie jest już potrzebny.