基于Java实现自定义定时器并对比原生定时器

基于Java实现自定义定时器并对比原生定时器

一.⭐⭐⭐定时器概述🌙🌙🌙

何为定时器?①就像可以设置闹钟的时钟一样。当我们往时钟里添加一个闹钟时,可以设置闹钟的首次执行时间、执行间隔时间、备注、是否启动等属性。②一个时钟可以设置多个不同的闹钟,每个闹钟可以有各自的首次执行时间、执行间隔时间、备注、是否启动等属性。③当闹钟响起后,如果我们不手动关闭该闹钟,那么它将会按照设定的执行间隔时间,一直持续执行下去,除非时钟电量耗尽。就如同一个可以设置闹钟的时钟一样,定时器有如下特性:①往定时器添加一个任务(就如同时钟上的闹钟)时,可以设置任务的首次执行时间、执行间隔时间、备注、是否启动等属性。②可以添加多个不同的任务,每个任务都有各自的首次执行时间、执行间隔时间、备注、是否启动等属性.③当任务启动后,除非调用任务取消的方法或者定时器取消方法,否则任务将按照设定的执行间隔时间,一直持续执行下去。

如何自定义实现一个定时器?当理解了定时器是啥后,我们就可以很容易利用面向对象编程的思想,去构造一个满足定时器特性的自定义的定时器了。

二.⭐⭐⭐自定义定时器🌙🌙🌙

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 mTimerList = new ArrayList();//存放定时器任务的列表

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();////取消定时器所有任务的执行

}

}

相关内容

硒鼓芯片怎么换
365体育投注账号被冻结

硒鼓芯片怎么换

📅 11-20 👁️ 3371
習俗百科/求不到籤別心急 可能是這些原因
beat365app下载官网

習俗百科/求不到籤別心急 可能是這些原因

📅 07-19 👁️ 4943
安东省 (中华民国)
365bet安卓

安东省 (中华民国)

📅 07-28 👁️ 740