java.util.Timer 是早期 Java 提供的簡易排程工具,雖已被 ScheduledExecutorService 取代,但在維護舊專案時仍常見。本文整理四種核心排程模式並附完整代碼。
| 方法 | 用途 | 特性 |
|---|---|---|
| schedule(task, time) | 指定時間執行一次 | 固定時間點 |
| schedule(task, delay, period) | 延遲後以固定間隔重複執行 | 固定延遲(上次結束後等待 period) |
| scheduleAtFixedRate(task, delay, period) | 延遲後以固定頻率重複執行 | 固定頻率(上次開始後等待 period) |
| scheduleAtFixedRate(task, firstTime, period) | 指定時間開始,固定頻率重複 | 適合每日定時任務 |
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerDemo {
public static void main(String[] args) {
// timer1(); // 單次執行
// timer2(); // 固定延遲
// timer3(); // 固定頻率
timer4(); // 每日定時
}
// 1. 指定時間單次執行(2 秒後)
public static void timer1() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override public void run() {
System.out.println("【timer1】指定任務執行 - " + new Date());
}
}, 2000);
}
// 2. 固定延遲:1 秒後開始,每 5 秒執行一次(上次結束後等 5 秒)
public static void timer2() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override public void run() {
System.out.println("【timer2】固定延遲執行 - " + new Date());
}
}, 1000, 5000);
}
// 3. 固定頻率:1 秒後開始,每 2 秒執行一次(上次開始後等 2 秒)
public static void timer3() {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override public void run() {
System.out.println("【timer3】固定頻率執行 - " + new Date());
}
}, 1000, 2000);
}
// 4. 每日中午 12:00 執行
public static void timer4() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date firstTime = calendar.getTime(); // 今日 12:00:00
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override public void run() {
System.out.println("【timer4】每日定時任務 - " + new Date());
}
}, firstTime, 1000L * 60 * 60 * 24); // 24 小時週期
}
}
// ScheduledExecutorService(執行緒池、支援取消、異常處理更完善)
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// 固定延遲
scheduler.scheduleWithFixedDelay(() -> System.out.println("任務"), 1, 5, TimeUnit.SECONDS);
// 固定頻率
scheduler.scheduleAtFixedRate(() -> System.out.println("任務"), 1, 2, TimeUnit.SECONDS);
ScheduledExecutorService 或 Spring @Scheduled。run() 內捕獲所有例外。