Concurrency Средний

Замените Timer и TimerTask на ScheduledExecutorService для надёжной запланированной работы.

✕ 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);
Заметили проблему в этом коде? Сообщите нам.
🧵

Лучшая изоляция

Настраиваемый пул потоков предотвращает совместное использование одного хрупкого воркера несвязанными задачами.

🛡

Надёжное выполнение

Сбой одной задачи не завершает работу самого планировщика.

🎛

Управляемый жизненный цикл

Future, отмена, задержки и завершение работы используют стандартные API executor'ов.

Старый подход
Timer и TimerTask
Современный подход
ScheduledExecutorService
Начиная с JDK
5
Сложность
Средний
От задач Timer к запланированным исполнителям
Доступно

Широко доступно начиная с JDK 5 (сент. 2004)

Timer выполняет все задачи в одном потоке, поэтому одна долго выполняющаяся задача задерживает остальные, а необработанное исключение завершает поток таймера. ScheduledExecutorService использует framework executor'ов, поддерживает несколько воркеров, возвращает дескрипторы ScheduledFuture и предоставляет явное управление жизненным циклом. Владеющий компонент должен останавливать планировщик, когда он больше не нужен.