自定义定时器和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();////取消定时器所有任务的执行
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章