4、 Timer 和 Timer Task 的使用
Timer 是一種定時器工具,用來在一個後台線程計劃執行指定任務,這些任務可以被執行一次,也可以被定期執行。每個 Timer 對象對應一個後台線程,順序地執行所有計時器任務。如果完成某個計時器任務的時間太長,那麼它會“獨佔”計時器的任務執行線程,從而可能延遲後續任務的執行。對 Timer 對象最後的引用完成並且所有未處理的任務都已執行完成後,計時器的任務執行線程會正常終止(並且成為記憶體回收的對象)。TimerTask是一個抽象類別,實現了Runable介面,它的子類代表一個可以被Timer計劃的任務。
1) 一個簡單的Demo,讓大家對Timer、TimerTask的使用有感性的認識。
2) Timer和TimerTask的常用api函數說明
這裡強調Timer類的schedule和scheduleAtFixedRate的區別。schedule和scheduleAtFixedRate的區別在於,schedule以固定的相對時間間隔執行,如果某一次執行被延時了,往後的執行的執行時間也會相對延時;而scheduleAtFixedRate是以絕對的時間間隔執行,如果某一次執行被延時,它的後一次執行的延時將會縮短(scheduleAtFixedRate會把已經過去的時間也作為周期執行)。schedule注重的是時間間隔的穩定,而scheduleAtFixedRate注重的是執行頻率的穩定。
3) Timer的終止
預設情況下,只要一個程式的timer線程在運行,那麼這個程式就會保持運行。當然,你可以通過以下四種方法終止一個timer線程:
a)調用timer的cancle方法。你可以從程式的任何地方調用此方法,甚至在一個timer task的run方法裡;
b)讓timer線程成為一個daemon線程(可以在建立timer時使用new Timer(true)達到這個目地),這樣當程式只有daemon線程的時候,它就會自動終止運行;
c)當timer相關的所有task執行完畢以後,刪除所有此timer對象的引用(置成null),這樣timer線程也會終止;
d)調用System.exit方法,使整個程式(所有線程)終止。
總結:Timer和TimerTask可以簡單理解為Timer定時器在觸發TimerTask任務調用,通常用schedule和scheduleAtFixedRate方法來調用timertask任務,cancle來終止任務調用。Timer簡單易用,比較適合提供輕量級的計時器功能,但是對時效性很強的任務調度請用其它方法來實現(正如javadoc所述”Timer does not offer real-time guarantees: it schedules tasks using the Object.wait(long) method”)。