Timer與TimerTask源碼閱讀雜記

TimerTask java

實現Runnable接口。能夠被Timer調度執行一次或者週期性執行的任務類。位於java.util包內。 安全

實例屬性: spa

int state; // 包括VIRGIN、SCHEDULED、EXECUTED、CANCELLED 線程

long nextExecutionTime;   // 下一次任務執行時刻 對象

long period;   // 週期性任務的執行時間間隔 排序

方法: 接口

TimerTask() 構造方法 隊列

abstract void run() rem

boolean cancel()  取消任務,更改任務狀態state爲CANCELLED。若是一次性任務尚未被執行或者是週期性任務,返回true。對於一次性任務,若是任務已經處於SCHEDULLED狀態但還沒有執行則永遠不會被執行。而對於週期性任務,若是任務尚未被調度,則任務將不會被執行;而若是已經在執行,則執行完當前週期,但以後不再會被執行。 get

這個方法能夠被屢次調用,但第二次以及以後的調用沒有任何效果。

long scheduledExecutionTime():

返回本任務將要被執行的時刻,對於週期性任務沒有什麼意義。


Timer

線程安全的,多個線程能夠共享一個Timer實例。

用來調度任務在未來執行一次或者週期性執行的輔助類。

每一個Timer對象都對應一個後臺線程(用於順序執行timer上的任務)。

每一個任務都應該能快速完成,不然若是某個TimerTask的執行佔用太多

時間會影響後面的任務執行。

若想快速終止任務執行,能夠調用它的cancel方法。

不提供實時保證,由於使用的Object.wait()方法。

實例屬性:

TaskQueue queue = new TaskQueue();   // 任務隊列,Binary Heap

TimerThread thread = new TimerThread(queue);

經過schedule方法將TimerTask加入TaskQueue

方法:

scheduleAtFixedRate:

sched(task, System.currentTimeMillis()+delay, period);

sechedule:

sched(task, System.currentTimeMillis()+delay, -period);


TimerThread extends Thread

執行具體任務的線程。

從任務隊列取出executionTime最小的元素,而後判斷若是是一次性任務則...


TaskQueue

任務隊列類。是TimerTask的優先隊列,根據nextExecutionTime排序。

基於Balanced Binary Heap實現,add、removeMin和rescheduleMin操做的時間複雜度爲log(n)。getMin操做的時間複雜度爲O(n)。小頂堆。

經過add(TimerTask task)加入任務

相關文章
相關標籤/搜索