自定义定时器和Java自带原生定时器

    技术2022-07-10  149

    一. 定时器概述

    何为定时器? ①就像可以设置闹钟的时钟一样。当我们往时钟里添加一个闹钟时,可以设置闹钟的首次执行时间、执行间隔时间、备注、是否启动等属性。 ②一个时钟可以设置多个不同的闹钟,每个闹钟可以有各自的首次执行时间、执行间隔时间、备注、是否启动等属性。 ③当闹钟响起后,如果我们不手动关闭该闹钟,那么它将会按照设定的执行间隔时间,一直持续执行下去,除非时钟电量耗尽。 就如同一个可以设置闹钟的时钟一样,定时器有如下特性: ①往定时器添加一个任务(就如同时钟上的闹钟)时,可以设置任务的首次执行时间、执行间隔时间、备注、是否启动等属性。 ②可以添加多个不同的任务,每个任务都有各自的首次执行时间、执行间隔时间、备注、是否启动等属性. ③当任务启动后,除非调用任务取消的方法或者定时器取消方法,否则任务将按照设定的执行间隔时间,一直持续执行下去。如何自定义实现一个定时器? 当理解了定时器是啥后,我们就可以很容易利用面向对象编程的思想,去构造一个满足定时器特性的自定义的定时器了。 二. 自定义定时器 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();取消定时器所有任务的执行 } }
    Processed: 0.012, SQL: 9