java多線程(5) ----- 定時器Timer

(歡迎關注微信公衆號:深入Java底層)

JDK庫中Timer類主要負責計劃任務的功能,也就是在指定的時間開始執行某一個任務。Timer類的主要作用就是設置計劃任務,但封裝任務的類卻是TimerTask類。執行計劃任務的代碼要放入TimerTask的子類中,因爲TimeTask是一個抽象類。

5.1 方法schedule(TimerTasktask,Date time)的測試

該方法的作用是在指定的日期執行一次某一任務。

1.執行任務的時間晚於當前時間:在未來執行的效果

2.計劃時間早於當前時間:提前運行效果

如果執行任務的時間早於當前時間,則立即執行task任務。

3.多個TimerTask任務及延時的測試

Timer中允許有多個TimerTask任務。TimerTask是以隊列的方式一個一個被順序執行的,所以執行的時間有可能和預期的時間不一致,因爲前面的任務有可能消耗的時間較長,則後面的任務運行的時間也會被延遲。

5.2 方法schedule(TimerTasktask,Date firstTime,long period)的測試

該方法的作用是在指定的日期之後,按指定的間隔週期性地無限循環地執行某一任務。

1.     計劃時間晚於當前時間:在未來執行的效果

2.     計劃時間早於當前時間:提前運行的效果

如果計劃時間早於當前時間,則立即執行task任務。

3.     任務執行時間被延時

4.     TimerTask類的cancle()方法

TimerTask類中的cancle()方法的作用是將自身從任務隊列中清除,其他任務不受影響。

5.     Timer類的cancle()方法

和TimerTask類中的cancle()方法清除自身不同,Timer類中的cancle()方法的作用是將任務隊列中的全部任務清空。

6.     Timer類的cancle()方法注意事項

Timer類中的cancle()方法有時並不一定會停止執行計劃任務,而是正常執行。這是因爲Timer類中的cancle()方法有時並沒有爭搶到queue鎖,所以TimerTask類中的任務繼續正常運行。

5.3 方法schedule(TimerTasktask,long delay)的測試

該方法的作用是以執行schedule(TimerTask task,long delay)方法當前的時間爲參考時間,在此時間基礎上延遲指定的毫秒數後執行一次TimerTask任務。

5.4 方法schedule(TimerTasktask,long delay,long period)的測試

該方法的作用是以執行schedule(TimerTask task,long delay,long period)方法當前的時間爲參考時間,再此時間基礎上延遲指定的毫秒數,再以某一間隔時間無限次數地執行某一任務。

凡是使用方法中帶有period參數的,都是無限循環執行TimerTask中的任務。

5.5 方法scheduleAtFixedRate(TimerTasktask,Date firstTime,long period)的測試

方法schedule和方法scheduleAtFixedRate都會按順序執行,所以不要考慮非線程安全的情況。

方法schedule和scheduleAtFixedRate主要的區別只在於不延時的情況。

使用schedule方法:如果執行任務的時間沒有被延時,那麼下一次任務的執行時間參考的是上一次任務的“開始”時的時間來計算。

使用scheduleAtFixedRate方法:如果執行任務的時間沒有被延時,那麼下一次任務的執行時間參考的是上一次任務的“結束”時的時間來計算。

延時的情況則沒有區別,也就是使用schedule或scheduleAtFixedRate方法都是如果執行任務的時間被延時,那麼下一次任務的執行時間參考的是上一次任務“結束”時的時間來計算。

schedule方法不具有追趕執行性,scheduleAtFixedRate方法具有追趕執行性。

(歡迎關注微信公衆號:深入Java底層)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章