Timer定時器實現原始碼分析

2021-07-16 07:22:42 字數 2799 閱讀 7202

timer實現

使用:入口1:private timer mtimer = new timer();

入口2:mtimer.schedule(new timertask()

1000, 1000};

原始碼分析:

入口1:

// 1.

public timer()

// 2.啟動執行緒查詢是否有任務

timerimpl(string name, boolean isdaemon)

入口2:

// 3.插入乙個任務佇列

public void schedule(timertask task, long delay, long period)

private void scheduleimpl(timertask task, long delay, long period,

boolean fixed) }*/

}// 4.執行緒執行,不斷查詢任務並執行

timerimpl.run // 執行緒中執行各個任務

@override

public void run()

if (tasks.isempty())

this.wait(); // 如果任務佇列中沒有任務,則休眠

continue; // wait方法經常和while+continue何用

}// 6.計算距任務執行還需要的時間,並且sleep消耗掉剩餘時間

long currenttime = system.currenttimemillis();

timernode tasknode = tasks.minimum(); // 取出任務佇列中離任務執行剩餘時間最少的任務

task = tasknode.task;

long timetosleep;

if (task.cancelled)

// check the time to sleep for the first task scheduled

timetosleep = task.when - currenttime;

if (timetosleep > 0)

// 7.執行到點的任務,並刪除該任務,如果該任務是repeat,則重新設定定點時間,並把任務重新新增到佇列

// no sleep is necessary before launching the task

if (task.cancelled)

// set time to schedule

task.setscheduledtime(task.when); // 內部實現:scheduledtime = time;(將when賦值給schedule)

// remove task from queue

tasks.delete(tasknode); // 將未來要執行的任務刪除佇列。 刪除即將執行的任務節點

// 迴圈定時器,而非只定時一次

// set when the next task should be launched

if (task.period >= 0) else

task.run(); // 真正的業務執行**

}}小結:

1.timer中物件的關係:

-timer

-timerimpl 定時器的控制物件,內部維護timertree。本質是執行緒類

——timertree 定時器佇列,內部維護timernode鍊錶

-timernode 定時器節點,內部維護乙個定時任務

-timertask 定時任務,內部是具體定是任務執行**(內部實現runnable介面)

2.大概執行過程:如步驟1-7

建立定時器(本質是執行緒類),並執行執行緒方法,執行緒方法查詢當前任務佇列中是否有任務佇列,如果有任務直接執行任務,

並將任務移除佇列,重新新增任務到任務佇列中。

補充:各個類核心成員資料

private static final class timerimpl extends thread field of taskscheduled object.

*/private timertree tasks = new timertree(); // timertree維護著timertree

} private static final class timertree

public void deleteifcancelled(timertree tasks)

if (right != null)

if (task.cancelled) }}

} public abstract class timertask implements runnable {

/* lock object for synchronization. it's also used by timer class. */

final object lock = new object();

/* if timer was cancelled */

boolean cancelled;

/* slots used by timer */

long when;

long period;

boolean fixedrate;

/** the time when task will be executed, or the time when task was launched

* if this is task in progress.

*/private long scheduledtime;

Timer定時器開發

timer定時器開發 定時器的作用是不佔執行緒的等待乙個確定時間,同樣通過callback來通知定時器到期。參考 定時器的建立 同樣是在wftaskfactory類裡的方法 using timer callback t std function class wftaskfactory static ...

Timer定時器開發

timer定時器開發 定時器的作用是不佔執行緒的等待乙個確定時間,同樣通過callback來通知定時器到期。參考 定時器的建立 同樣是在wftaskfactory類裡的方法 using timer callback t std function class wftaskfactory 第乙個引數為定...

timer定時器中斷

注意 tcmpbn的值用於脈衝寬度調製 pwm 當遞減計數器值與定時器控制邏輯中比較暫存器的值匹配時,定時器控制邏輯將更改輸出電平。因此,比較暫存器確定pwm輸出的開啟時間 或關閉時間 此時不會產生定時器中斷,只會使得輸出電平發生反轉。1 定時器具有tcntbn,tcntn,tcmpbn和tcmpn...