概覽
java.util.Timer 提供四種核心排程方法,適用於簡單的定時任務需求。本文以表格與代碼對比四種模式的適用場景。
方法速查表
| 方法簽名 | 觸發時間 | 重複模式 | 典型用途 |
| schedule(TimerTask, Date) | 指定 Date 時間 | 單次 | 預約單次任務 |
| schedule(TimerTask, long delay, long period) | delay 毫秒後 | 固定延遲 | 間隔固定時間的輪詢 |
| scheduleAtFixedRate(TimerTask, long delay, long period) | delay 毫秒後 | 固定頻率 | 精確頻率的監控上報 |
| scheduleAtFixedRate(TimerTask, Date, long period) | 指定 Date 時間 | 固定頻率 | 每日/每週定時批次 |
代碼示範
Timer timer = new Timer();
// 1. 5 秒後單次執行
timer.schedule(new TimerTask() {
public void run() { System.out.println("單次任務"); }
}, new Date(System.currentTimeMillis() + 5000));
// 2. 1 秒後開始,每 3 秒固定延遲
timer.schedule(new TimerTask() {
public void run() { System.out.println("固定延遲"); }
}, 1000, 3000);
// 3. 立即開始,每 2 秒固定頻率
timer.scheduleAtFixedRate(new TimerTask() {
public void run() { System.out.println("固定頻率"); }
}, 0, 2000);
// 4. 每天凌晨 3 點執行
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 3);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
timer.scheduleAtFixedRate(new TimerTask() {
public void run() { System.out.println("每日備份"); }
}, cal.getTime(), 24 * 60 * 60 * 1000L);
常見陷阱與對策
- 任務拋出未捕獲例外 → Timer 執行緒終止,後續任務全停。
對策:run() 內包裹 try-catch(Throwable)。
- 任務執行時間過長 → 固定頻率模式下會堆積並行執行。
對策:評估改用 ScheduledExecutorService 或縮短任務邏輯。
- 系統時間調整 → 影響基於絕對時間的排程。
對策:優先使用相對時間(delay/period)或 Quartz 等專業排程框架。
何時選用 Timer vs ScheduledExecutorService
| 場景 | 推薦 |
| 簡單單次/週期任務、舊版本維護 | Timer |
| 高併發、需取消/重新排程、異常隔離 | ScheduledExecutorService |
| 分散式、持久化、Cron 運算式、集群 | Quartz / Spring Batch |