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...