(歡迎關注微信公衆號:深入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底層)