Java多線程編程核心技術-第5章-定時器 Timer-讀書筆記

第 5 章 定時器 Timer

  定時 / 計劃功能在移動開發領域使用較多,比如 Android 技術。定時計劃任務功能在 Java 中主要使用的就是 Timer 對象,他在內部使用多線程的方式進行處理,所以它和線程技術還是有非常大的關聯的。

本章主要內容

如何實現指定時間執行任務。
如何實現按指定週期執行任務。

5.1 定時器 Timer 的使用

  在 JDK 庫中 Timer 類主要負責計劃任務的功能,也就是在指定的時間開始執行某一個任務。

  Timer 類的方法列表:

  Timer 類的主要作用就是設置計劃任務,但封裝任務的類卻是 TimerTask。

  類 TimeTask 類相關的信息:

  執行計劃任務的代碼要放入 TimerTask 的子類中,因爲 TimerTask 是一個抽象類。

5.1.1 方法 schedule(TimerTask,Date time)的測試

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

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

  當執行任務的時間是晚於當前時間的,等到計劃的時間,TimerTask 中的任務會被執行,但是任務執行完了,但進程還未銷燬。

  創建一個 Timer 就是啓動一個新的線程,新啓動的線程並不是守護線程,所以它一直在運行。

  選擇守護線程進行運行,程序運行後迅速結束當前的進程,並且 TimerTask 中的任務不再被運行,因爲進程已經結束了。

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

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

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

  Timer 中允許由多個 TimerTask 任務。

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

5.1.2 方法 schedule(TimerTask task,Date firstTime,long period)的測試

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

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

  等到了計劃的時間,每隔間隔時間運行一次 TimerTask 任務,並且是無限期地重複執行。

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

  如果計劃時間早於當前時間,則立即執行 task 任務。每隔間隔時間運行一次 TimerTask 任務,並且是無限期地重複執行。

3. 任務執行時間被延時

  當任務需要運行的時間大於間隔時間時,任務是以任務運行的時間爲間隔循環運行。

4. TimerTask 類的 cancel() 方法

  TimerTask 類中的 cancel() 方法的作用是將自身從任務隊列中清除。

  TimerTask 類的 cancel() 放啊是將子什麼從任務隊列中被移除,其他任務不受影響。

5. Timer 類的 cancel() 方法

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

  全部任務都被清除,並且進程被銷燬。

6. TImer 的 cancel() 方法注意事項

  Timer 類中的 cancel() 方法有時並不一定會停止執行任務之花,而是正常執行。

  這是因爲 Timer 類中的 cancel() 方法有時並沒有爭搶到 queue 鎖,所以 TimerTask 類中的任務繼續正常執行。

5.1.3 方法 schedule(TimerTask task,long delay) 的測試

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

5.1.4 方法 schedule(TimerTask task,long delay,long period) 的測試

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

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

5.1.5 方法 scheduleAtFixedRate(TimerTask task,Date firstTime,long period) 的測試

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

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

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

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

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

1.測試 schedule 方法任務不延時

  在不延時的情況下,如果執行任務的時間沒有被延時(執行任務的時間小於 delay 的時間),則下一次執行任務的時間是上一次任務的開始時間加上 delay 時間。

2.測試 schedule 方法任務延時

  如果執行任務的時間被延時(執行任務的時間大於 delay 的時間),那麼下一次任務的執行時間以上一次任務“結束”時的時間爲參考來計算。

3.測試 scheduleAtFixedRate 方法任務不延時

  如果執行任務的時間沒有被延時(執行任務的時間小於 delay 的時間),則下一次認知性任務的時間是上一次任務的開始時間加上 delay 時間。

4.測試 scheduleAtFixedRate 方法任務延時

  如果執行任務的時間被延時(執行任務的時間大於 delay 的時間),那麼下一次任務的執行時間以上一次任務“結束”時的時間爲參考來計算。

5.驗證 schedule 方法不具有追趕執行性

  任務計劃時間早於當前時間,而任務計劃時間到當前時間之間的時間所對應的 Task 任務被取消了,不執行了。這就是 Task 任務不追趕的情況。

6. 驗證 scheduleAtFixedRate 方法具有追趕執行性

  任務計劃時間早於當前時間,而任務計劃時間到當前時間之間的時間所對應的 Task 任務被“補充性”執行了,這就是 Task 任務追趕執行的特性。

5.2 本章總結

  通過本章的學習,應該掌握如何在 Java 中使用定時任務的功能,並且可以對這些定時任務使用指定的 API 進行處理。

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