Concurrency Fortgeschritten

Von Timer und TimerTask zu ScheduledExecutorService

Timer und TimerTask durch ScheduledExecutorService für robuste Aufgabenplanung ersetzen.

✕ 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);
Problem mit diesem Code entdeckt? Sag uns Bescheid.
🧵

Bessere Isolation

Ein konfigurierbarer Thread-Pool verhindert, dass sich unabhängige Zeitpläne einen fragilen Worker teilen.

🛡

Robuste Ausführung

Eine fehlschlagende Aufgabe beendet nicht den Scheduler selbst.

🎛

Steuerbarer Lebenszyklus

Futures, Abbruch, Verzögerungen und Herunterfahren nutzen Standard-Executor-APIs.

Alter Ansatz
Timer und TimerTask
Moderner Ansatz
ScheduledExecutorService
Seit JDK
5
Schwierigkeitsgrad
Fortgeschritten
Von Timer und TimerTask zu ScheduledExecutorService
Verfügbar

Weithin verfügbar seit JDK 5 (Sept. 2004)

Timer führt jede Aufgabe auf einem Thread aus, sodass eine lang laufende Aufgabe die anderen verzögert und eine unbehandelte Ausnahme den Timer-Thread beendet. ScheduledExecutorService nutzt das Executor-Framework, unterstützt mehrere Worker, liefert ScheduledFuture-Handles und bietet ein explizites Lifecycle-Management. Die besitzende Komponente muss den Scheduler herunterfahren, wenn er nicht mehr benötigt wird.