--------------------------------------------------------------
1. Timer是一個安全執行緒的單線程的任務調度工具,對於任務的調度有如下幾種調度方式
-------------------------------------
a. 目前時間+時延
b. 目前時間+時延+任務執行間隔
c. 目前時間+時延+任務執行循環
d. 指定時間
e. 指定時間+時延
f. 指定時間+時延+任務執行間隔
g. 指定時間+時延+任務執行循環
-------------------------------------
任務執行間隔和任務執行循環區別在於,對於任務執行間隔是指上一次執行開始到下一次執行
之間的時間間隔,而任務執行循環是指從(指定時間+時延)或者(目前時間+時延)確定的時間點
每隔周期長時間執行一次,看起來好像是麼有什麼區別,其實之間的區別就在於,對於
a. 對於Timer而言,TimerTask執行的時間是不能很準確的確定的,它跟其前面的任務執行的時間
是有關係的,例如其前面的任務執行了個死迴圈,那它是永久沒有執行機會的
b. 那麼任務執行間隔類型任務期望執行的時間是不確定的,其具體的執行時間根本就不可能確定
c. 那麼任務執行循環類型任務期望執行的時間是確定的,而其具體的執行時間根本就不可能確定
d. 有時間周期的任務是周期執行,而其他的任務只執行一次
e. TimerTask是可以被取消的,只要設定其自己的狀態屬性就可以了
--------------------------------------------------------------
2. 程式邏輯分析
a. 資料結構
1. Timer主要有兩個資料結構,一個是使用最小堆資料結構實現的隊列,另一個是調度任務執行的線程
2. 線程執行邏輯是一個死迴圈
a. 如果任務隊列queue目前沒有任務,則會進入休眠等待
b. 當線程被喚醒有兩種可能,一是有任務加入,一是Timer啟動了關閉,如果是Timer啟動了關閉則退出死迴圈
c. 取出queue.top,處於TOP的任務是第一個需要執行的任務,如果任務已經被CANCEL則回到a
d. 取系統目前時間,如果top期待的執行時間是小於等於目前時間則任務可以執行
在執行前有如下操作:如果不是週期性任務則從任務隊列中取出,如果是週期性任務
又分任務執行間隔和任務執行循環,對於任務執行間隔將任務期望執行時間在
目前時間基礎上加上周期,對於任務執行循環則是在任務原本期待時間加上周期
調整任務隊列...
如果top期待的執行時間是大於目前時間則線程休眠其差值
e. 如果任務可以執行,則執行,注意麼有cache運行時異常,所以注意傳進來的任務異常
要捕捉好,否則整個Timer就報廢了...
f. 這個線程是一個死迴圈,其退出死迴圈的條件就是2.a.2.b
b. 關閉Timer主要操作是將任務隊列queue抽空,等任務調度線程執行到2.a.2.b時退出
--------------------------------------------------------------
1. 在使用Timer時注意TimerTask裡面函數的異常捕捉,出現異常危害很大
2. Timer不能保證TimerTask按照指定的時間執行...
3. 調用Timer關閉函數和使線程退出是一樣的,只能然其運行到某個標誌退出處
--------------------------------------------------------------