定时器问题
定时器属于基本的基础组件,不管是用户空间的程序开发,还是内核空间的程序开发,很多时候都需要有定时器作为基础组件的支持。一个定时器的实现需要具备以下四种基本行为:添加定时器、取消定时器、定时器检查、到期执行。
请设计一个定时器并实现以下三种基本行为,函数原型已给出,可使用任意编程语言设计数据结构及实现,并尽可能高效地支持大量定时器:
// 添加定时器:经过特定时间间隔后执行目标操作
// 输入 1:Interval 定时器时间,单位ms
// 输入 2:ExpiryAction 目标操作
// 返回:定时器 Id
StartTimer(Interval, ExpiryAction) -> TimerId
// 取消定时器
// 输入:定时器 Id
StopTimer(TimerId)
// 定时器检查
// 系统每隔 10ms 会调用一次该函数
PerTickBookkeeping()
话不多说,直接上代码:
1)Timer.java:
import java.util.ArrayList; public class Timer { private long interval; // 定时器时间,单位 ms private String expiryAction; // 目标操作 private int timerId; // 定时器Id private long waitTime; // 定时器等待时间 // 构造函数 public Timer(){ this.waitTime = 0; } // 添加定时器 public int StartTimer(long interval, String expiryAction, int id){ this.interval = interval; this.expiryAction = expiryAction; this.timerId = id; return timerId; } // 取消定时器 public void StopTimer(int timerId, ArrayList<Timer> timer){ timer.remove(timerId); } // 定时器检查 public void PerTickBookkeeping(){ if (this.interval > this.waitTime) this.waitTime += 10; else{ System.out.println("定时器"+this.timerId+":"+this.expiryAction); this.waitTime = 0; } } public long getInterval() { return interval; } public void setInterval(long interval) { this.interval = interval; } public String getExpiryAction() { return expiryAction; } public void setExpiryAction(String expiryAction) { this.expiryAction = expiryAction; } public int getTimerId() { return timerId; } public void setTimerId(int timerId) { this.timerId = timerId; } public long getWaitTime() { return waitTime; } public void setWaitTime(long waitTime) { this.waitTime = waitTime; } }
2)DoTimer.java:
import java.util.ArrayList; import java.util.Iterator; public class DoTimer extends Thread { private static ArrayList<Timer> timerList; public static void main(String[] args){ timerList = new ArrayList<Timer>(); Timer timer1 = new Timer(); timer1.StartTimer(3000, "我是第一个定时器,等待3秒", 0); Timer timer2 = new Timer(); timer2.StartTimer(4000, "我是第二个定时器,等待4秒", 1); timerList.add(timer1); timerList.add(timer2); //public void run(){} new Thread(){ @Override public void run() { while(true){ Iterator<Timer> it = timerList.iterator(); while(it.hasNext()){ it.next().PerTickBookkeeping(); } try { sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }.start(); timer1.StopTimer(timer1.getTimerId(), timerList); } }
希望本篇文章可以帮助到您
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。