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