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){
Iteratorit=timerList.iterator();
while(it.hasNext()){
it.next().PerTickBookkeeping();
}
try{
sleep(10);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
}.start();
timer1.StopTimer(timer1.getTimerId(),timerList);
}
}
希望本篇文章可以帮助到您