用 ScheduledExecutorService 替代 Timer 和 TimerTask,实现更健壮的定时任务。
代码对比
✕ 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、取消、延迟和关闭都使用标准的 executor API。
旧方式
Timer 和 TimerTask
现代方式
ScheduledExecutorService
自 JDK
5
难度
中级
JDK 支持
从 Timer 任务到调度执行器
可用
自 JDK 5(2004 年 9 月)起广泛可用
工作原理
Timer 在单个线程上执行所有任务,因此一个耗时任务会延迟其他任务,一个未捕获的异常会终止该定时器线程。ScheduledExecutorService 使用 executor 框架,支持多个工作线程,返回 ScheduledFuture 句柄,并提供显式的生命周期管理。拥有该调度器的组件必须在不再需要时将其关闭。
相关文档
证明