Java--定時器問題,java--定時器
定時器問題
定時器屬於基本的基礎組件,不管是使用者空間的程式開發,還是核心空間的程式開發,很多時候都需要有定時器作為基礎組件的支援。一個定時器的實現需要具備以下四種基本行為:添加定時器、取消定時器、定時器檢查、到期執行。
請設計一個定時器並實現以下三種基本行為,函數原型已給出,可使用任意程式設計語言設計資料結構及實現,並儘可能高效地支援大量定時器:
// 添加定時器:經過特定時間間隔後執行目標操作
// 輸入 1:Interval 定時器時間,單位ms
// 輸入 2:ExpiryAction 目標操作
// 返回:定時器 Id
StartTimer(Interval, ExpiryAction) -> TimerId
// 取消定時器
// 輸入:定時器 Id
StopTimer(TimerId)
// 定時器檢查
// 系統每隔 10ms 會調用一次該函數
PerTickBookkeeping()
話不多說,直接上代碼:
1)Timer.java:
1 import java.util.ArrayList; 2 3 public class Timer { 4 5 private long interval; // 定時器時間,單位 ms 6 private String expiryAction; // 目標操作 7 private int timerId; // 定時器Id 8 private long waitTime; // 定時器等待時間 9 10 // 建構函式11 public Timer(){12 this.waitTime = 0;13 }14 15 // 添加定時器16 public int StartTimer(long interval, String expiryAction, int id){17 this.interval = interval;18 this.expiryAction = expiryAction;19 this.timerId = id;20 return timerId;21 }22 23 // 取消定時器24 public void StopTimer(int timerId, ArrayList<Timer> timer){25 timer.remove(timerId);26 }27 28 // 定時器檢查29 public void PerTickBookkeeping(){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 long getInterval() {40 return interval;41 }42 public void setInterval(long interval) {43 this.interval = interval;44 }45 public String getExpiryAction() {46 return expiryAction;47 }48 public void setExpiryAction(String expiryAction) {49 this.expiryAction = expiryAction;50 }51 public int getTimerId() {52 return timerId;53 }54 public void setTimerId(int timerId) {55 this.timerId = timerId;56 }57 public long getWaitTime() {58 return waitTime;59 }60 public void setWaitTime(long waitTime) {61 this.waitTime = waitTime;62 }63 }
2)DoTimer.java:
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 4 public class DoTimer extends Thread { 5 6 private static ArrayList<Timer> timerList; 7 8 public static void main(String[] args){ 9 10 timerList = new ArrayList<Timer>();11 Timer timer1 = new Timer();12 timer1.StartTimer(3000, "我是第一個定時器,等待3秒", 0);13 Timer timer2 = new Timer();14 timer2.StartTimer(4000, "我是第二個定時器,等待4秒", 1);15 timerList.add(timer1);16 timerList.add(timer2);17 18 //public void run(){}19 new Thread(){20 @Override21 public void run() {22 while(true){23 Iterator<Timer> 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 block31 e.printStackTrace();32 }33 }34 }35 }.start();36 timer1.StopTimer(timer1.getTimerId(), timerList);37 38 }39 }
感謝各位提出改進意見,小李會選擇更好的方法,改進自己的程式!
著作權,允許轉載,轉載請註明出處,侵權必究!