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

Java 定時任務與線程池最佳實踐:ScheduledThreadPoolExecutor 完勝 Timer

     編輯:Java 相關知識

推薦配置速查

// 定時調度器:2 核心線程
private static final ScheduledThreadPoolExecutor SCHEDULER =
    new ScheduledThreadPoolExecutor(2);

// 業務線程池:10 核心線程
private static final ExecutorService EXECUTOR =
    Executors.newFixedThreadPool(10);

// 使用示例
SCHEDULER.scheduleAtFixedRate(new Task(), 5, 180, TimeUnit.SECONDS); // 5s 後每 3 分鐘執行
EXECUTOR.execute(new Task());

Task 實現範例

class Task implements Runnable {
    @Override public void run() { System.out.println("執行任務..."); }
}

Timer vs ScheduledThreadPoolExecutor 深度對比

維度TimerScheduledThreadPoolExecutor
時間基準絕對時間(敏感於系統時間修改)相對時間(不受系統時間影響)
線程模型單線程串行執行所有任務線程池並發執行,可配置核心數
異常處理任務拋出未檢查異常 → Timer 線程終止 → 所有後續任務停止單任務異常被捕獲隔離,不影響其他任務
取消/管理僅 cancel() 整個 Timer支持 Future.cancel() 單任務取消,shutdown() 整體關閉
API 豐富度簡單支持固定延遲、固定頻率、自定義 Trigger、可查詢隊列狀態

異常隔離實戰驗證

ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(2);
scheduler.scheduleAtFixedRate(() -> { throw new RuntimeException("任務1崩潰"); }, 2, 5, TimeUnit.SECONDS);
scheduler.scheduleAtFixedRate(() -> System.out.println("任務2正常"), 2, 5, TimeUnit.SECONDS);
// 結果:任務1反覆拋異常,任務2不受影響持續輸出

最佳實踐建議

  1. 棄用 Timer:新代碼統一使用 ScheduledThreadPoolExecutor 或 Spring @Scheduled(底層同樣基於它)。
  2. 分離調度與執行:調度器僅負責觸發,耗時業務提交至業務線程池(EXECUTOR.submit(() -> scheduler.execute(task))),避免長任務佔用調度線程導致後續調度延遲。
  3. 優雅關閉:應用停止時調用 scheduler.shutdown()、executor.shutdown(),配合 awaitTermination 等待任務完成。
  4. 監控指標:暴露隊列積壓數、活躍線程數、任務執行耗時(Micrometer/Prometheus)。

Spring Boot 整合示例

@Configuration
@EnableScheduling
public class SchedulerConfig {
    @Bean public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler s = new ThreadPoolTaskScheduler();
        s.setPoolSize(2);
        s.setThreadNamePrefix("scheduler-");
        return s;
    }
    @Bean public ExecutorService executorService() {
        return Executors.newFixedThreadPool(10);
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved