定时器问题
定时器属于基本的基础组件,不管是用户空间的程序开发,还是内核空间的程序开发,很多时候都需要有定时器作为基础组件的支持。一个定时器的实现需要具备以下四种基本行为:添加定时器、取消定时器、定时器检查、到期执行。
请设计一个定时器并实现以下三种基本行为,函数原型已给出,可使用任意编程语言设计数据结构及实现,并尽可能高效地支持大量定时器:
// 添加定时器:经过特定时间间隔后执行目标操作
// 输入 1:Interval 定时器时间,单位ms
// 输入 2:ExpiryAction 目标操作
// 返回:定时器 Id
StartTimer(Interval, ExpiryAction) -> TimerId
// 取消定时器
// 输入:定时器 Id
StopTimer(TimerId)
// 定时器检查
// 系统每隔 10ms 会调用一次该函数
PerTickBookkeeping()
话不多说,直接上代码:
1)Timer.java:
1 importjava.util.ArrayList;2
3 public classTimer {4
5 private long interval; //定时器时间,单位 ms
6 private String expiryAction; //目标操作
7 private int timerId; //定时器Id
8 private long waitTime; //定时器等待时间9
10 //构造函数
11 publicTimer(){12 this.waitTime = 0;13 }14
15 //添加定时器
16 public int StartTimer(long interval, String expiryAction, intid){17 this.interval =interval;18 this.expiryAction =expiryAction;19 this.timerId =id;20 returntimerId;21 }22
23 //取消定时器
24 public void StopTimer(int timerId, ArrayListtimer){25 timer.remove(timerId);26 }27
28 //定时器检查
29 public voidPerTickBookkeeping(){30 if (this.interval > this.waitTime)31 this.waitTime += 10;32 else{33 System.out.println("定时器"+this.timerId+":"+this.expiryAction);34 this.waitTime = 0;35 }36 }37
38
39 public longgetInterval() {40 returninterval;41 }42 public void setInterval(longinterval) {43 this.interval =interval;44 }45 publicString getExpiryAction() {46 returnexpiryAction;47 }48 public voidsetExpiryAction(String expiryAction) {49 this.expiryAction =expiryAction;50 }51 public intgetTimerId() {52 returntimerId;53 }54 public void setTimerId(inttimerId) {55 this.timerId =timerId;56 }57 public longgetWaitTime() {58 returnwaitTime;59 }60 public void setWaitTime(longwaitTime) {61 this.waitTime =waitTime;62 }63 }
2)DoTimer.java:
1 importjava.util.ArrayList;2 importjava.util.Iterator;3
4 public class DoTimer extendsThread {5
6 private static ArrayListtimerList;7
8 public static voidmain(String[] args){9
10 timerList = new ArrayList();11 Timer timer1 = newTimer();12 timer1.StartTimer(3000, "我是第一个定时器,等待3秒", 0);13 Timer timer2 = newTimer();14 timer2.StartTimer(4000, "我是第二个定时器,等待4秒", 1);15 timerList.add(timer1);16 timerList.add(timer2);17
18 //public void run(){}
19 newThread(){20 @Override21 public voidrun() {22 while(true){23 Iterator it =timerList.iterator();24 while(it.hasNext()){25 it.next().PerTickBookkeeping();26 }27 try{28 sleep(10);29 } catch(InterruptedException e) {30 //TODO Auto-generated catch block
31 e.printStackTrace();32 }33 }34 }35 }.start();36 timer1.StopTimer(timer1.getTimerId(), timerList);37
38 }39 }
感谢各位提出改进意见,小李会选择更好的方法,改进自己的程序!
版权所有,允许转载,转载请注明出处,侵权必究!