Java中TimerTask适用于单线程、低精度定时任务,核心是继承TimerTask重写run()并用Timer调度;但不支持并发、异常会终止线程、无任务管理能力,高要求场景应选ScheduledThreadPoolExecutor或Quartz。

Java中用TimerTask做定时任务,核心就两点:定义任务逻辑、安排执行时机。它轻量简单,适合单线程、精度要求不高的场景,但不支持并发、无法自动恢复、缺乏管理能力——别把它当Quartz用。
定义自己的任务类(继承TimerTask)
TimerTask是个抽象类,必须重写run()方法,里面写你要定时执行的代码:
- 不能抛出受检异常(必须在内部try-catch)
- 避免在run里做耗时操作,否则会阻塞整个Timer线程
- 示例:
class MyTask extends TimerTask {
public void run() {
System.out.println("任务执行时间:" + new Date());
}
}
创建Timer并调度任务
Timer负责启动后台线程、按计划触发任务。注意:一个Timer对应一个任务线程,多个TimerTask共享这个线程:
立即学习“Java免费学习笔记(深入)”;
- schedule(TimerTask, long delay):延迟delay毫秒后执行一次
- schedule(TimerTask, Date time):在指定时间点执行一次
- schedule(TimerTask, long delay, long period):延迟后,每period毫秒执行一次(固定延迟)
- scheduleAtFixedRate(...):按固定频率执行(更接近“每N毫秒跑一次”,即使某次执行延迟,后续会加速补上)
例如:new Timer().schedule(new MyTask(), 1000, 2000); 表示1秒后开始,之后每2秒执行一次。
别忽略的几个关键细节
- Timer线程默认是非守护线程,只要还有未取消任务,JVM就不会退出
- 任务抛出未捕获异常会导致Timer线程终止,后续所有任务都停摆(务必在run里兜底)
- cancel()只取消当前TimerTask;timer.cancel()终止整个Timer及其所有任务,且不可重启
- Timer不是线程安全的,不要跨线程共享同一个Timer实例
什么时候该换别的方案?
如果遇到这些情况,建议换成ScheduledThreadPoolExecutor或第三方框架:
- 需要多个并行执行的任务
- 任务可能长时间阻塞或抛异常,不想影响其他任务
- 要动态增删/暂停/查询任务
- 需持久化任务、集群协调、失败重试等企业级能力
基本上就这些。TimerTask够用但有边界,看清需求再选工具。










