定時任務在企業級應用中無處不在:數據清理、報表生成、緩存刷新、定時推送等。本文深度解析三種主流實現方式:普通 Thread、Timer/TimerTask、ScheduledExecutorService,幫助你根據場景選擇最佳方案。
最原始、最直觀的方式,通過無限循環配合 Thread.sleep() 實現定時效果。
public class Task1 {
public static void main(String[] args) {
final long timeInterval = 1000; // 1 秒
Runnable runnable = new Runnable() {
public void run() {
while (true) {
// ------- 任務業務代碼 -------
System.out.println("Hello !!");
// ------- 結束 -------
try {
Thread.sleep(timeInterval);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread thread = new Thread(runnable);
thread.start();
}
}
優點:簡單直接,無依賴。
缺點:無法精確控制執行時間(sleep 時間不包含任務執行時間)、無法動態取消/暫停、異常導致線程終止、無線程池管理。
Java 早期提供的標準定時任務框架。
import java.util.Timer;
import java.util.TimerTask;
public class Task2 {
public static void main(String[] args) {
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("Hello !!!");
}
};
Timer timer = new Timer();
long delay = 0;
long intervalPeriod = 1 * 1000; // 1 秒
timer.scheduleAtFixedRate(task, delay, intervalPeriod);
}
}
優點:支持延遲啟動、固定頻率/固定延遲兩種調度模式、線程安全、可取消任務。
缺點:單線程串行執行(長任務會阻塞後續任務)、異常導致整個 Timer 失效、無線程池、精度受系統時鐘影響。
來自 java.util.concurrent 包,是現代 Java 定時任務的首選方案。
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Task3 {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
public void run() {
System.out.println("Hello !!");
}
};
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);
}
}
優點:線程池管理、異常隔離(單任務異常不影響其他)、靈活的時間單位、支持固定頻率/固定延遲、可動態調整線程數、豐富的 API(scheduleWithFixedDelay 等)。
缺點:API 相對複雜、需手動關閉線程池。
| 場景 | 推薦方案 |
|---|---|
| 簡單臨時任務、測試驗證 | Thread + sleep |
| 輕量級、單任務、無高併發 | Timer/TimerTask |
| 生產環境、多任務、高可靠性、需線程池 | ScheduledExecutorService |
| 分佈式、集群、持久化、監控管理 | Quartz / Spring Task / XXL-JOB |
shutdown() 等待任務完成