首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Timer 定時器四種排程用法完整範例

     編輯:Java 相關知識

前言

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 小時週期
    }
}

關鍵差異:固定延遲 vs 固定頻率

  • 固定延遲:任務執行時間若超過 period,下一次會順延,適合「間隔固定時間」的業務(如心跳檢測)。
  • 固定頻率:無論任務耗時,嚴格按 period 頻率觸發,適合「精確時間點」的業務(如每整點報表)。

現代替代方案

// ScheduledExecutorService(執行緒池、支援取消、異常處理更完善)
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// 固定延遲
scheduler.scheduleWithFixedDelay(() -> System.out.println("任務"), 1, 5, TimeUnit.SECONDS);
// 固定頻率
scheduler.scheduleAtFixedRate(() -> System.out.println("任務"), 1, 2, TimeUnit.SECONDS);

最佳實務建議

  1. 新專案優先使用 ScheduledExecutorService 或 Spring @Scheduled。
  2. Timer 執行緒異常會導致後續任務停止,需在 run() 內捕獲所有例外。
  3. 長時間運行的任務應避免阻塞 Timer 唯一執行緒,改用執行緒池。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved