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

Java Timer 與 TimerTask 定時器完整詳解與實戰範例

     編輯:Java 相關知識

前言

Java 提供 java.util.Timer 與 java.util.TimerTask 實現基礎排程功能。雖然現代專案多採用 ScheduledExecutorService 或 Spring @Scheduled,但理解 Timer 基礎機制對維護舊系統、輕量級任務仍有價值。本文詳細解析兩類別用法、排程模式差異與實戰範例。

核心類別關係

  • Timer:排程器,負責管理任務佇列與執行緒,單一執行緒循環執行任務
  • TimerTask:實作 Runnable 的抽象類別,封裝實際業務邏輯(run() 方法)

兩種排程模式詳細比較

1. schedule - 固定延遲執行


// 首次延遲 1 秒執行,之後每 2 秒執行一次
timer.schedule(task, 1000, 2000);

// 指定日期首次執行,之後每 3 分鐘執行
timer.schedule(task, firstTime, 3 * 60 * 1000);

特性:若任務執行時間超過間隔,下一次執行會順延;不會補償過去遲到的執行。

2. scheduleAtFixedRate - 固定頻率執行


// 立即啟動,每 2 秒執行
timer.scheduleAtFixedRate(task, 0, 2000);

// 指定過去時間啟動,會嘗試補償漏執行的次數
timer.scheduleAtFixedRate(task, pastDate, 3 * 60 * 1000);

特性:嚴格維持頻率,若發現落後會嘗試追趕(連續執行多次),適合對時間敏感的任務。

關鍵差異實測場景

假設目前 14:17,排程設定 14:10 開始、每 3 分鐘執行:

模式實際執行時間下一次排程
scheduleAtFixedRate立即連續執行 3 次(補 14:10、14:13、14:16)14:19(從基準時間推算)
schedule立即執行 1 次14:20(從實際執行時間推算)

實戰範例一:獨立 TimerTask 類別

public class MyTask extends TimerTask {
    @Override
    public void run() {
        System.out.println("任務執行:" + new Date());
        // 業務邏輯:發送報表、清理快取、資料同步等
    }
}

public class TimerDemo {
    public static void main(String[] args) {
        Timer timer = new Timer();
        // 1 秒後啟動,每 2 秒執行一次
        timer.schedule(new MyTask(), 1000, 2000);
    }
}

實戰範例二:匿名內部類寫法

public class SearchRun {
    public static void startRun() {
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println("開始執行排程任務");
                // 呼叫服務層方法
            }
        };
        // 固定頻率:從現在開始,每 2 秒
        timer.scheduleAtFixedRate(task, new Date(), 2000);
    }

    public static void main(String[] args) {
        startRun();
    }
}

進階用法與注意事項

取消排程

timer.cancel();        // 取消所有任務,執行緒結束
task.cancel();         // 取消單一任務
timer.purge();         // 從佇列移除已取消任務,釋放記憶體

常見陷阱

  1. 單執行緒瓶頸:Timer 只有一個背景執行緒,長時間任務會阻塞後續排程
  2. 異常吞沒:TimerTask 拋出未捕獲異常會導致整個 Timer 執行緒終止,建議在 run() 內 try-catch
  3. 系統時間變更:schedule 受系統時間影響,scheduleAtFixedRate 較穩定
  4. 記憶體洩漏:大量任務未 cancel 並 purge 會佔用記憶體

現代替代方案建議

方案適用場景優點
ScheduledExecutorService高併發、需多執行緒排程執行緒池、彈性配置、異常隔離
Spring @ScheduledSpring 生態專案聲明式、支援 Cron、整合事務
Quartz複雜排程、叢集、持久化功能豐富、企業級可靠度

總結

Timer/TimerTask 適合簡單、輕量、單機的定時需求。理解 schedule 與 scheduleAtFixedRate 的語義差異對正確實現業務邏輯至關重要。生產環境建議遷移至 ScheduledExecutorService 或 Spring 排程框架以獲得更好穩定性與擴展性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved