Concurrency Średniozaawansowany

Z zadań Timer do zaplanowanych executorów

Zastąp Timer i TimerTask za pomocą ScheduledExecutorService dla solidnej pracy zaplanowanej.

✕ Timer and TimerTask
Timer timer = new Timer("refresh-timer");
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        refresh();
    }
}, 0, 60_000);
✓ ScheduledExecutorService
ScheduledExecutorService scheduler =
        Executors.newScheduledThreadPool(2);

scheduler.scheduleAtFixedRate(
        this::refresh, 0, 1, TimeUnit.MINUTES);
Widzisz problem z tym kodem? Daj nam znać.
🧵

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.

Stare podejście
Timer i TimerTask
Nowoczesne podejście
ScheduledExecutorService
Od JDK
5
Poziom trudności
Średniozaawansowany
Z zadań Timer do zaplanowanych executorów
Dostępne

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.