TimerTask结合Timer可实现简单定时任务,如每日9点提醒;通过schedule设置首次执行时间及周期,但因单线程、异常中断等问题,生产环境建议用ScheduledExecutorService或Spring @Scheduled。

在Java项目中实现任务定时提醒功能,TimerTask 是一个轻量且实用的解决方案,特别适用于不需要复杂调度逻辑的场景。它结合 Timer 类可以方便地执行周期性或延迟执行的任务,比如每日消息提醒、系统状态检查等。
1. Timer 和 TimerTask 基本原理
Timer 是 Java 提供的用于调度延迟或重复执行任务的工具类,而 TimerTask 是一个抽象类,表示一个可被调度执行的任务。你需要继承 TimerTask 并重写其 run() 方法来定义具体操作。
常见方法:
- schedule(TimerTask task, long delay):延迟指定毫秒后执行一次
- schedule(TimerTask task, long delay, long period):延迟后按固定周期重复执行
2. 实现每日定时提醒案例
假设我们需要每天上午9:00发送一条“今日待办提醒”消息。以下是具体实现:
立即学习“Java免费学习笔记(深入)”;
import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask;public class DailyReminder {
public static void main(String[] args) { Timer timer = new Timer(); TimerTask reminderTask = new TimerTask() { @Override public void run() { System.out.println("【提醒】现在是 " + new Date() + ",请处理今日待办事项!"); } }; // 设置首次执行时间为今天上午9点 Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 9); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); // 如果当前时间已超过9点,则延到明天 if (calendar.getTimeInMillis() <= System.currentTimeMillis()) { calendar.add(Calendar.DAY_OF_MONTH, 1); } // 每24小时(86400000毫秒)执行一次 long period = 24 * 60 * 60 * 1000; timer.schedule(reminderTask, calendar.getTime(), period); }}
运行后,程序会在每天上午9点输出提醒信息,持续执行直到JVM关闭。
3. 注意事项与局限性
虽然 TimerTask 简单易用,但在实际项目中需注意以下几点:
- Timer 是单线程的,如果某个任务执行时间过长,会影响后续任务的准时执行
- 若任务抛出异常且未捕获,整个 Timer 将停止运行
- 不支持更复杂的调度规则(如每周一、每月1号等),此时应考虑使用 Quartz 或 Spring 的 @Scheduled
4. 替代方案建议
对于生产环境或复杂需求,推荐使用:
- ScheduledExecutorService:线程池支持,更健壮的定时调度
- Spring @Scheduled:集成在Spring项目中,支持cron表达式
- Quartz:功能强大,适合企业级调度系统
基本上就这些。TimerTask适合小型应用或学习使用,理解其机制有助于掌握更高级的调度工具。










