1. 程式人生 > 其它 >Timer與TimerTask的真正原理&使用介紹

Timer與TimerTask的真正原理&使用介紹

https://blog.csdn.net/xieyuooo/article/details/8607220

這個方法是排程一個task,經過delay(ms)後開始進行排程,僅僅排程一次。

public void schedule(TimerTask task, long delay)

在指定的時間點time上排程一次。

public void schedule(TimerTask task, Date time)

這個方法是排程一個task,在delay(ms)後開始排程,每次排程完後,最少等待period(ms)後才開始排程。

public void schedule(TimerTask task, long
delay, long period)

和上一個方法類似,唯一的區別就是傳入的第二個引數為第一次排程的時間。

public void schedule(TimerTask task, Date firstTime, long period)
public void scheduleAtFixedRate(TimerTask task, long delay, long period)

排程一個task,在delay(ms)後開始排程,然後每經過period(ms)再次排程,貌似和方法:schedule是一樣的,其實不然,後面你會根據原始碼看到,schedule在計算下一次執行的時間的時候,是通過當前時間(在任務執行前得到) + 時間片,而scheduleAtFixedRate方法是通過當前需要執行的時間(也就是計算出現在應該執行的時間)+ 時間片,前者是執行的實際時間,而後者是理論時間點,例如:schedule時間片是5s,那麼理論上會在5、10、15、20這些時間片被排程,但是如果由於某些CPU徵用導致未被排程,假如等到第8s才被第一次排程,那麼schedule方法計算出來的下一次時間應該是第13s而不是第10s,這樣有可能下次就越到20s後而被少排程一次或多次,而scheduleAtFixedRate方法就是每次理論計算出下一次需要排程的時間用以排序,若第8s被排程,那麼計算出應該是第10s,所以它距離當前時間是2s,那麼再排程佇列排序中,會被優先排程,那麼就儘量減少漏掉排程的情況。

方法同上,唯一的區別就是第一次排程時間設定為一個Date時間,而不是當前時間的一個時間片,我們在原始碼中會詳細說明這些內容。

public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)