自学内容网 自学内容网

多线程--模拟实现定时器--Java

一、定时器的概念

定时器的本质就是一个闹钟,时间到了开始执行某些逻辑。Java标准库中的定时器是Timer。

我们查阅Java文档可以详细看到定时器的使用方法:

Timer最核心的方法就是schedule方法。值得注意的是我们通常描述任务是使用Runnable来描述,在这里是用TimerTask来描述。通过对源码的查看可以看到TimerTask是继承Runnable接口的抽象类。

 

 二、模拟实现定时器

通过以上定时器的概念,我们可以知道在定时器中需要一个容器来存储任务,分析可知定时器中任务执行的顺序与需要等待的时间有关,需要等待的时间越小越先执行,所以我们可以用一个优先级队列(默认为小根堆)来存储任务。

对于模拟实现TimerTask,我们可以创建抽象类MyTimerTask也继承Runnable重写run方法。

也可以创建出一个普通类MyTimerTask其中包含一个private Runnable的数据。

由于我们使用优先级队列存储任务,所以MyTImerTask需要继承Comparable接口重写compareto方法来定义比较规则。

至此我们模拟实现定时器基础的架构就构造完毕了,然后我们实现定时器最核心的schedule方法 即可。 

 我们的schedule方法只需两个参数分别是一个Runnable参数表示要执行的任务,剩下的一个参数表示多长时间后我们要执行这个任务。然后将构造出的MyTimerTask添加到队列中即可。

到这里为止我们的定时器就差最后一步,在构造方法中创建线程来执行任务。

由于我们执行任务是一个线程,schedule添加任务也是一个线程,会出现线程安全问题所以我们应该加锁。 

至此我们完成了模拟实现定时器。 

三、简单测试定时器

写以上代码便能清晰看到定时器的定时执行功能。 


原文地址:https://blog.csdn.net/2301_79995226/article/details/143520993

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!