От задач Timer к запланированным исполнителям
Замените Timer и TimerTask на ScheduledExecutorService для надёжной запланированной работы.
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);
Лучшая изоляция
Настраиваемый пул потоков предотвращает совместное использование одного хрупкого воркера несвязанными задачами.
Надёжное выполнение
Сбой одной задачи не завершает работу самого планировщика.
Управляемый жизненный цикл
Future, отмена, задержки и завершение работы используют стандартные API executor'ов.
Широко доступно начиная с JDK 5 (сент. 2004)
Timer выполняет все задачи в одном потоке, поэтому одна долго выполняющаяся задача задерживает остальные, а необработанное исключение завершает поток таймера. ScheduledExecutorService использует framework executor'ов, поддерживает несколько воркеров, возвращает дескрипторы ScheduledFuture и предоставляет явное управление жизненным циклом. Владеющий компонент должен останавливать планировщик, когда он больше не нужен.