自定義定時器和Java自帶原生定時器

一. 定時器概述

  1. 何爲定時器?
    ①就像可以設置鬧鐘的時鐘一樣。當我們往時鐘裏添加一個鬧鐘時,可以設置鬧鐘的首次執行時間、執行間隔時間、備註、是否啓動等屬性。
    ②一個時鐘可以設置多個不同的鬧鐘,每個鬧鐘可以有各自的首次執行時間、執行間隔時間、備註、是否啓動等屬性。
    ③當鬧鐘響起後,如果我們不手動關閉該鬧鐘,那麼它將會按照設定的執行間隔時間,一直持續執行下去,除非時鐘電量耗盡。
    就如同一個可以設置鬧鐘的時鐘一樣,定時器有如下特性:
    ①往定時器添加一個任務(就如同時鐘上的鬧鐘)時,可以設置任務的首次執行時間、執行間隔時間、備註、是否啓動等屬性。
    ②可以添加多個不同的任務,每個任務都有各自的首次執行時間、執行間隔時間、備註、是否啓動等屬性.
    ③當任務啓動後,除非調用任務取消的方法或者定時器取消方法,否則任務將按照設定的執行間隔時間,一直持續執行下去。
  2. 如何自定義實現一個定時器?
    當理解了定時器是啥後,我們就可以很容易利用面向對象編程的思想,去構造一個滿足定時器特性的自定義的定時器了。
    二. 自定義定時器
    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();////取消定時器所有任務的執行
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章