Java時間類庫Timer的使用方法與例項詳解
阿新 • • 發佈:2020-02-21
使用 Java 來排程定時任務時,我們經常會使用 Timer 類搞定。Timer 簡單易用,在一些業務場景下用來實現簡單定時排程。
Jave時間類庫Timer簡單使用
- 建立Timer物件
- 編寫 自己的 task 類,該類整合 TimerTask,重寫 run 方法,把要定時執行的邏輯寫在裡面
- 使用 Timer 執行 TimerTask
// 5秒後開始執行,每秒執行一次 Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { System.out.println("hello world"); } },50000,1000);
Timer 裡面的一些常用方法
經過delay(ms)後開始進行排程,僅僅排程一次。
public void schedule(TimerTask task,long delay)
在指定的時間點time上排程一次
public void schedule(TimerTask task,Date time)
在delay(ms)後開始排程,每次排程完後,最少等待period(ms)後才開始排程
public void schedule(TimerTask task,long delay,long period)
在到了指定時間後開始排程,每次排程完後,最少等待period(ms)後才開始排程。
public void schedule(TimerTask task,Date firstTime,long period)
在delay(ms)後開始排程,然後每經過period(ms)再次排程。
public void scheduleAtFixedRate(TimerTask task,long period)
schedule方法的區別在於:
schedule在計算下一次執行的時間的時候,是通過當前時間(在任務執行前得到) + 時間片,而scheduleAtFixedRate方法是通過當前需要執行的時間(也就是計算出現在應該執行的時間)+ 時間片,前者是執行的實際時間,而後者是理論時間點。比如:
- schedule 時間片是 5s,那麼理論上會在 5、10、15、20這些時間片被排程,但是如果由於某些 CPU 徵用導致未被排程,假如等到第 8s 才被第一次排程,那麼 schedule 方法計算出來的下一次時間應該是第 13s 而不是第 10s
- scheduleAtFixedRate 方法就是每次理論計算出下一次需要排程的時間用以排序,若第8s被排程,那麼計算出應該是第 10s,所以它距離當前時間是 2s
在到了指定時間後開始排程,每次排程完後,最少等待period(ms)後才開始排程。
public void scheduleAtFixedRate(TimerTask task,long period)
內部結構
Timer 類裡包含一個任務佇列和一個非同步輪詢執行緒。任務佇列裡容納了所有待執行的任務,所有的任務將會在這一個非同步執行緒裡執行,切記:
- 任務的執行程式碼不可以丟擲異常,否則會導致 Timer 執行緒掛掉,所有的任務都沒得執行了。
- **單個任務也不易執行時間太長,否則會影響任務排程在時間上的精準性。**比如你一個任務跑了太久,其它等著排程的任務就一直處於飢餓狀態得不到排程。所有任務的執行都是這單一的 TimerThread 執行緒。
public class Timer { private final TaskQueue queue = new TaskQueue(); private final TimerThread thread = new TimerThread(queue); }
Timer 的任務佇列 TaskQueue 是一個特殊的佇列,它內部是一個數組。這個陣列會按照待執行時間進行堆排序,堆頂元素總是待執行時間最小的任務。
更多關於Jave時間類庫Timer的使用方法與例項請檢視下面的相關連結