一、定时器的概念
定时器的本质就是一个闹钟,时间到了开始执行某些逻辑。Java标准库中的定时器是Timer。
我们查阅Java文档可以详细看到定时器的使用方法:
Timer最核心的方法就是schedule方法。值得注意的是我们通常描述任务是使用Runnable来描述,在这里是用TimerTask来描述。通过对源码的查看可以看到TimerTask是继承Runnable接口的抽象类。
二、模拟实现定时器
通过以上定时器的概念,我们可以知道在定时器中需要一个容器来存储任务,分析可知定时器中任务执行的顺序与需要等待的时间有关,需要等待的时间越小越先执行,所以我们可以用一个优先级队列(默认为小根堆)来存储任务。
对于模拟实现TimerTask,我们可以创建抽象类MyTimerTask也继承Runnable重写run方法。
也可以创建出一个普通类MyTimerTask其中包含一个private Runnable的数据。
由于我们使用优先级队列存储任务,所以MyTImerTask需要继承Comparable接口重写compareto方法来定义比较规则。
至此我们模拟实现定时器基础的架构就构造完毕了,然后我们实现定时器最核心的schedule方法 即可。
我们的schedule方法只需两个参数分别是一个Runnable参数表示要执行的任务,剩下的一个参数表示多长时间后我们要执行这个任务。然后将构造出的MyTimerTask添加到队列中即可。
到这里为止我们的定时器就差最后一步,在构造方法中创建线程来执行任务。
由于我们执行任务是一个线程,schedule添加任务也是一个线程,会出现线程安全问题所以我们应该加锁。
至此我们完成了模拟实现定时器。
三、简单测试定时器
写以上代码便能清晰看到定时器的定时执行功能。