java.util.Timer(排程器)+ java.util.TimerTask(任務單元)構成 Java 內建排程框架(J2SE 1.3+、J2ME 亦支援)。核心機制:單一背景執行緒循序執行所有任務。
public class EggTimer {
private final Timer timer = new Timer();
private final int minutes;
public EggTimer(int minutes) { this.minutes = minutes; }
public void start() {
timer.schedule(new TimerTask() {
@Override public void run() {
playSound();
timer.cancel(); // 單次任務執行完關閉 Timer
}
private void playSound() {
System.out.println("Your egg is ready!");
}
}, minutes * 60 * 1000L); // 延遲毫秒
}
public static void main(String[] args) {
new EggTimer(2).start(); // 2 分鐘後提醒
}
}
| 方法 | 用途 | 參數說明 |
|---|---|---|
schedule(task, delay) | 一次性任務 | delay:延遲毫秒 |
schedule(task, time) | 指定時間一次性 | time:Date 物件 |
schedule(task, delay, period) | 固定延遲週期執行 | 上次執行結束後 delay 再執行,適合頻率不嚴格場景 |
scheduleAtFixedRate(task, delay, period) | 固定頻率週期執行 | 嚴格按時間軸間隔,適合精確排程(如每分鐘備份) |
schedule(task, firstTime, period) | 指定首次時間 + 週期 | firstTime:Date |
scheduleAtFixedRate 依賴系統時間,時間跳躍會導致任務重複或漏跑。文章提出兩類別 + 一介面的輕量框架:
Scheduler:統一入口,管理任務註冊、啟動、關閉。ScheduleTask:擴充 TimerTask,增加任務 ID、描述、下次執行時間計算邏輯。Trigger 介面:nextExecutionTime() 定義複雜排程規則(每日固定時間、每月最後一天、工作日、Cron 表達式等)。
public interface Trigger {
Date nextExecutionTime(Date lastExecutionTime);
}
// 範例:每日固定時間觸發器
public class DailyTrigger implements Trigger {
private final int hour, minute;
public DailyTrigger(int hour, int minute) { this.hour = hour; this.minute = minute; }
@Override
public Date nextExecutionTime(Date last) {
Calendar cal = Calendar.getInstance();
cal.setTime(last != null ? last : new Date());
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, minute);
cal.set(Calendar.SECOND, 0);
if (!cal.getTime().after(last)) cal.add(Calendar.DAY_OF_MONTH, 1);
return cal.getTime();
}
}
除非極簡場景(單機、無持久化需求),否則直接上成熟方案:
| 框架 | 特點 | 適用場景 |
|---|---|---|
| Spring @Scheduled | 輕量、整合 Spring、支援 Cron/固定頻率 | 單體應用、簡單定時任務 |
| Quartz | 功能豐富、叢集、持久化、Cron、監聽器 | 企業級、需高可用、動態管理 |
| XXL-JOB | 分散式、Web 控制台、分片廣播、故障轉移 | 微服務、多節點、運維友好 |
| PowerJob | 新生代、高效能、支援工作流、多語言 | 大規模、複雜依賴、雲原生 |
Timer 適合「單機、簡單、非關鍵」排程。理解其單執行緒模型與時間跳躍缺陷,是避坑關鍵。需要「每天固定時間、夏令時安全、叢集高可用」時,請毫不猶豫選用 Quartz 或 XXL-JOB,專注業務而非造輪子。