天天看點

任務排程(一)——jdk自帶的Timer

       說到任務排程,大家可能會想到Quartz架構,但是jdk自帶的簡單任務排程工具類,反而了解的人并不是很多。我覺得如果你的業務相對簡單的話,沒必要非得用Quartz等架構,使用Timer完全可以勝任的。簡單來分享一下我了解的Timer。

  Timer是jdk中提供的一個定時器工具,使用的時候會在主線程之外起一個單獨的線程執行指定的計劃任務,可以指定執行一次或者反複執行多次。

  TimerTask是一個實作了Runnable接口的抽象類,代表一個可以被Timer執行的任務。

       我是用TimerTask來建立一個任務,其中run方法裡是任務排程的邏輯。使用一個Timer對象來排程任務。

       首先給一個特别簡單的示例:

       隻要執行main方法就可以測試了。

       大家可能已經注意到了,timer的schedule方法是重載的。參數主要有必須有一個TimerTask執行個體。第二個參數如果是long類型的,這個參數則是表示延遲時間,以毫秒為機關。如果為1000,那就是1秒後執行任務排程。如果是Date類型,則表示設定任務開始執行的時刻。當時間到達這個時刻,那麼任務會自動開始排程。當然如果目前時間已經超過了設定的開始時間,那麼會立即執行一次。第三個參數則是可選參數,是long類型的參數,表示排程的間隔時間。如果有這個參數,表示任務是重複性的排程。否則隻會執行一次。這個參數依舊以毫秒為機關。

       如果你稍微注意一下,就會發現timer不隻提供了schedule方法,還提供了scheduleAtFixedRate方法。這兩個方法都是任務排程方法,他們有什麼差別呢?

       差別在于當目前時間已經超過了設定執行時間,schedule方法會立即執行,第二次執行則是按目前執行時間+間隔時間來算的(當然任務執行時間超過了間隔時間,則在第一次執行完畢後,立馬會執行第二次)。而scheduleAtFixedRate方法,同樣是立即執行一次,但是它第二次執行則是按照(目前執行時間-設定的時間)/時間間隔來計算從設定時間到現在還需要執行多少次。

       舉個例子:任務排程需要執行2s,間隔時間是10s,我設定的是8點執行。目前時間為8點0分10秒,如果是schedule方法,則會立即執行一次,第二次執行時間則是08:00:20。如果是scheduleAtFixedRate方法,則會立即執行一次,然後計算08:00:10-08:00:00整好還可以執行一次,是以會在08:00:12時,會立即再執行一次,第三次執行則是在08:00:20時執行,以後每隔10s執行一次。

任務排程(一)——jdk自帶的Timer
任務排程(一)——jdk自帶的Timer

(左圖是schedule方法的測試效果,右圖是scheduleAtFixedRate方法的測試效果)

       這個跟網上很多人說的不太一樣。不過這個是我測試出來了。他們說的那種結果反正我是測不出來。具體你相信哪種,你自己試過就清楚了。

       下篇分享一下怎樣動态修改Timer的排程計劃,敬請期待。