一. 定時器概述
- 何爲定時器?
①就像可以設置鬧鐘的時鐘一樣。當我們往時鐘裏添加一個鬧鐘時,可以設置鬧鐘的首次執行時間、執行間隔時間、備註、是否啓動等屬性。
②一個時鐘可以設置多個不同的鬧鐘,每個鬧鐘可以有各自的首次執行時間、執行間隔時間、備註、是否啓動等屬性。
③當鬧鐘響起後,如果我們不手動關閉該鬧鐘,那麼它將會按照設定的執行間隔時間,一直持續執行下去,除非時鐘電量耗盡。
就如同一個可以設置鬧鐘的時鐘一樣,定時器有如下特性:
①往定時器添加一個任務(就如同時鐘上的鬧鐘)時,可以設置任務的首次執行時間、執行間隔時間、備註、是否啓動等屬性。
②可以添加多個不同的任務,每個任務都有各自的首次執行時間、執行間隔時間、備註、是否啓動等屬性.
③當任務啓動後,除非調用任務取消的方法或者定時器取消方法,否則任務將按照設定的執行間隔時間,一直持續執行下去。 - 如何自定義實現一個定時器?
當理解了定時器是啥後,我們就可以很容易利用面向對象編程的思想,去構造一個滿足定時器特性的自定義的定時器了。
二. 自定義定時器
1.自定義定時任務接口(用於實現特性②,通過實現接口可以生成多個不同的任務實現)
public interface ITimerTask{public void doTimerTask ();}
2.實現自定義的定時任務接口(具體的任務實現)
pulic class TimerTaskImp implements ITimerTask{
@Override
public void doTimerTask(){開始執行具體業務處理邏輯};
}
3.定義定時任務處理線程(擁有任務屬性類,方便在添加任務時對不同任務設置各自的屬性)
class TimetTaskItem{//單個Timer的相關參數
public ITimerTask timerTask = null; //執行定時任務的實現類
public long iPeriodTime = 0; //定時的週期時間(毫秒)
public long iNextTriggerTime = 0; //下次觸發時間
public boolean bIsRun = true;
public void cancel(){//取消任務執行的方法
this.bIsRun = false;
}
}
public class TimerTaskThread extends Thread{//定時器(通過線程的方式實現,Java原生定時器也是通過線程管理任務的定時執行的)
private ArrayList<TimerTaskItem> mTimerList = new ArrayList<TimerTaskItem>();//存放定時器任務的列表
protected boolean bIsRun = true; //是否運行
public void cancel(){//取消定時器執行的方法
this.bIsRun = false;
}
//添加定時器
@param timerTask 執行定時任務的實現類
@param iPeriodTime 執行各後續任務之間的時間間隔(毫秒)
@param iStartDelayTime開始執行定時任務的延遲時間(毫秒)
public void addTimer(ITimerTask timerTask,long iPeriodTime,long iStartDelayTime){
TimerTaskItem timerTaskItem = new TimerTaskItem();//單個任務
timerTaskItem.timerTask = timerTask;
timer.iPeriodTime = iPeriodTime;
timer.iNextTriggerTime=System.currentTimeMillis()+iStartDelayTime+iPeriodTime;
this.mTimerList.add(timerTaskItem);
}
public void run(){
while(bIsRun){//線程是否已運行
Thread.sleep(5);
synchronized(this.mTimerList){
long currTIme = System.currentTimeMillis();
for(int i = 0; I < this.mTimerList.size(); i++){//遍歷任務列表
TimerTaskItem task = this.mTimerList.get(i);
if(task. bIsRun){
if(task!=null&&currTime>= task.iNextTriggerTime){//判斷執行時間
task.timerTask.doTimerTask();//調用任務對應執行類的執行方法執行任務
task.iNextTriggerTime=System.currentTimeMillis()+task.iPeriodTime;
}
}
}
}
}
}
}
三. Java自帶原生定時器
Java自帶原生定時器主要有以下幾個類:
Timer定時器
TaskQueue 定時任務隊列類
TimerTask[] queue存放定時任務的數組、
TimerThread extends Thread定時器處理線程(循環處理任務數組裏最先需要執行的任務)
TimerTask implements Runnable定時任務抽象類(定義任務要執行的方法)
代碼實現如下:
package unittest;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import unittest.util.CommUtil;
public class TestLocal{
public static void main(String[] args) throws InterruptedException {
Timer timer = new Timer();//定義定時器,會初始化存放任務隊列的TaskQueue queue和定時器任務處理線程TimerThread thread,並啓動thread
TimerTask timerTask1 = new TimerTask(){//創建定時器任務1
public void run(){//任務1方法
CommUtil.sysPrintInfo("timerTask1");
}
};
TimerTask timerTask2 = new TimerTask(){//創建定時器任務2
public void run(){//任務2方法
CommUtil.sysPrintInfo("timerTask2");
}
};
int period = 2*1000;
Date firstTime = new Date(System.currentTimeMillis()+period);
CommUtil.sysPrintInfo("start");
timer.schedule(timerTask1, firstTime, period);//制定任務1定時執行計劃
timer.schedule(timerTask2, firstTime, period); //制定任務2定時執行計劃
timerTask1.cancel();//取消timerTask1任務執行
timerTask2.cancel();//取消timerTask2任務執行
timer.cancel();////取消定時器所有任務的執行
}
}