Java定时器问题实例解析
定时器问题
定时器属于基本的基础组件,不管是用户空间的程序开发,还是内核空间的程序开发,很多时候都需要有定时器作为基础组件的支持。一个定时器的实现需要具备以下四种基本行为:添加定时器、取消定时器、定时器检查、到期执行。
请设计一个定时器并实现以下三种基本行为,函数原型已给出,可使用任意编程语言设计数据结构及实现,并尽可能高效地支持大量定时器:
//添加定时器:经过特定时间间隔后执行目标操作
//输入1:Interval定时器时间,单位ms
//输入2:ExpiryAction目标操作
//返回:定时器Id
StartTimer(Interval,ExpiryAction)->TimerId
//取消定时器
//输入:定时器Id
StopTimer(TimerId)
//定时器检查
//系统每隔10ms会调用一次该函数
PerTickBookkeeping()
话不多说,直接上代码:
1)Timer.java:
importjava.util.ArrayList; publicclassTimer{ privatelonginterval;//定时器时间,单位ms privateStringexpiryAction;//目标操作 privateinttimerId;//定时器Id privatelongwaitTime;//定时器等待时间 //构造函数 publicTimer(){ this.waitTime=0; } //添加定时器 publicintStartTimer(longinterval,StringexpiryAction,intid){ this.interval=interval; this.expiryAction=expiryAction; this.timerId=id; returntimerId; } //取消定时器 publicvoidStopTimer(inttimerId,ArrayListtimer){ timer.remove(timerId); } //定时器检查 publicvoidPerTickBookkeeping(){ if(this.interval>this.waitTime) this.waitTime+=10; else{ System.out.println("定时器"+this.timerId+":"+this.expiryAction); this.waitTime=0; } } publiclonggetInterval(){ returninterval; } publicvoidsetInterval(longinterval){ this.interval=interval; } publicStringgetExpiryAction(){ returnexpiryAction; } publicvoidsetExpiryAction(StringexpiryAction){ this.expiryAction=expiryAction; } publicintgetTimerId(){ returntimerId; } publicvoidsetTimerId(inttimerId){ this.timerId=timerId; } publiclonggetWaitTime(){ returnwaitTime; } publicvoidsetWaitTime(longwaitTime){ this.waitTime=waitTime; } }
2)DoTimer.java:
importjava.util.ArrayList; importjava.util.Iterator; publicclassDoTimerextendsThread{ privatestaticArrayListtimerList; publicstaticvoidmain(String[]args){ timerList=newArrayList (); Timertimer1=newTimer(); timer1.StartTimer(3000,"我是第一个定时器,等待3秒",0); Timertimer2=newTimer(); timer2.StartTimer(4000,"我是第二个定时器,等待4秒",1); timerList.add(timer1); timerList.add(timer2); //publicvoidrun(){} newThread(){ @Override publicvoidrun(){ while(true){ Iterator it=timerList.iterator(); while(it.hasNext()){ it.next().PerTickBookkeeping(); } try{ sleep(10); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } }.start(); timer1.StopTimer(timer1.getTimerId(),timerList); } }
希望本篇文章可以帮助到您