<JavaEE> 经典设计模式之 -- 定时器

目录

一、定时器的概念

二、Java 标准库中的定时器

三、实现自己的定时器


一、定时器的概念

什么是定时器?
定时器是软件开发中的一个常用且重要组件,作用是在达到设定时间后,执行指定的代码。

二、Java 标准库中的定时器

1)Timer 类
在 Java 中,使用 Timer 类实现定时器的功能。Timer 类使用 schedule() 方法为定时器添加待执行任务。
2)schedule() 方法
schedule() 方法需要两个参数,第一个参数是计划执行的任务代码,第二个参数是任务等待多少时间后开始执行。

代码演示 Timer 类的使用:

public class Timer_Demo0 {public static void main(String[] args) {//新建定时器;Timer timer = new Timer();//设定任务为打印,等待3秒后执行;timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("3号举手");}},3000);//设定任务为打印,等待2秒后执行;timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("2号举手");}},2000);//设定任务为打印,等待1秒后执行;timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("1号举手");}},1000);}
}//运行结果:
1号举手
2号举手
3号举手
...程序没有结束运行。
3)为什么程序没有结束?
Timer 类中,内置的线程是一个前台线程,只要有一个前台线程未结束,程序就不会停止运行。

三、实现自己的定时器

定时器结构分析

定时器可以设定多个任务,这些任务根据时间的先后,按顺序执行。

把这些任务放在一个队列中,每次要执行的任务,肯定是离计划时间最近的那个。

因此,使用优先级队列就可以达成这一目的。

优先级队列中需要存放的元素,就是通过 schedule() 方法加入的任务

每个元素的属性,都应该包括一份可执行的代码和一个设定的时间。

我们还需要在定时器中有一个工作线程,用于观测优先级队列的队首元素,是否达到了执行时间

代码演示实现自己的定时器:

//队列中的元素 MyTask 类;
class MyTask implements Comparable<MyTask>{//任务内容;private Runnable runnable;//执行时间,单位是一个毫秒级别的时间戳;private long time;public long getTime(){return time;}//使用任务内容和相对时间,构造MyTask;public MyTask(Runnable runnable,long delay){this.runnable = runnable;//系统当前时间+相对时间;this.time = System.currentTimeMillis()+delay;}public void run(){runnable.run();}//作为优先级队列的元素,需要可比较;@Overridepublic int compareTo(MyTask o) {return (int) (this.time - o.time);}
}//定时器类;
class MyTimer{//存放任务的队列;private PriorityQueue<MyTask> queue = new PriorityQueue<>();//保持监测的线程;private Thread t;//锁对象;private final Object locker = new Object();//schedule方法,向优先级队列中添加元素;public void schedule(Runnable runnable,long delay){synchronized (locker){MyTask task = new MyTask(runnable,delay);queue.offer(task);//入队列了,有元素了,可以唤醒线程了;locker.notify();}}//关闭定时器方法;public void cancel(){t.interrupt();}//定时器构造方法,new定时器时就把监测线程打开了;public MyTimer(){t = new Thread(()->{try {while (true){//加锁,下面的判断状态和修改数据的代码需要原子;synchronized (locker){//队列空了,线程就等待;if(queue.isEmpty()){locker.wait();}//查看任务是否到达执行时间;MyTask task = queue.peek();long curTime = System.currentTimeMillis();long taskTime = task.getTime();if(curTime >= taskTime){queue.poll();task.run();}else {//还没到达执行时间,则计算还有多久,并根据这个时间等待;locker.wait(taskTime - curTime);}}}}catch (InterruptedException e){//调用 cancel() 方法时,抛出这个异常,结束线程,并执行下述代码;System.out.println("定时器关闭");}});//线程在计时器被new出来时,就要保持运行的状态,随时监测任务队列;t.start();}
}

代码演示执行自己实现的定时器:

    public static void main(String[] args) throws InterruptedException {//新建一个定时器;MyTimer timer = new MyTimer();//添加三个任务;timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("3号举手");}},3000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("2号举手");}},2000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("1号举手");}},1000);//等待5秒,此时上述定时器任务已经执行完毕;Thread.sleep(5000);//调用 cancel() 方法,关闭定时器。timer.cancel();}

阅读指针 -> 《经典设计模式之 -- 线程池》

链接生成中.........

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis核心知识点总结

1.Redis介绍 Redis 是 NoSQL&#xff0c;但是可处理 1 秒 10w 的并发&#xff08;数据都在内存中&#xff09; 使用 java 对 redis 进行操作类似 jdbc 接口标准对 mysql&#xff0c;有各类实现他的实现类&#xff0c;我们常用的是 druid 其中对 redis&#xff0c;我们通常用 J…

C语言 if语句有无(;)分号问题

在C语言中&#xff0c;if语句后面不带分号&#xff08;;&#xff09;的情况有两种主要形式&#xff1a; 1. 带有大括号的代码块&#xff1a;如果if语句后面跟随一个由大括号&#xff08;{}&#xff09;包围的代码块&#xff0c;那么这个代码块中的语句只有在if条件为真时才会执…

【C语言】7-38 吉老师的回归 分数 15

7-38 吉老师的回归 分数 15 全屏浏览题目 切换布局 作者 DAI, Longao 单位 杭州百腾教育科技有限公司 曾经在天梯赛大杀四方的吉老师决定回归天梯赛赛场啦&#xff01; 为了简化题目&#xff0c;我们不妨假设天梯赛的每道题目可以用一个不超过 500 的、只包括可打印符号的…

分类与群组:解析分类和聚类分析技术

目录 写在开头1. 数据分类与聚类简介1.1 分类分析1.2 聚类分析1.3 对比分析2. 如何学习分类和聚类分析技术2.1 学习理论知识2.1.1 数学知识2.1.2 编程基础2.1.3 深入学习算法2.1.3.1 分类算法学习举例2.1.3.2 聚类算法学习举例2.1.4 参与实战2.2 应用成功案例2.2.1 分类算法成功…

16、XSS——会话管理

文章目录 一、web会话管理概述1.1 会话管理1.2 为什么需要会话管理&#xff1f;1.3 常见的web应用会话管理的方式 二、会话管理方式2.1 基于server端的session的管理方式2.2 cookie-based的管理方式2.3 token-based的管理方式 三、安全问题 一、web会话管理概述 1.1 会话管理 …

加速度jsudo:IC商城系统4.0版正式发布 PCB计价电子元器件商城

近日&#xff0c;在加速度软件新品会发布会上&#xff0c;Mike正式公布了其4.0版本的电子元器件商城系统&#xff0c;展示了迭代后的强大新功能。在招募了数十家元器件销售、运营和老板测试体验后&#xff0c;获得了大家一致的好评。其中&#xff0c;中国电子南京某子公司董事长…

VMware虚拟机系统CentOS镜像的下载

文章目录 阿里云下载官网下载参考文档 一些小版本可能过时或者其他原因已经不能存在了&#xff0c;只有大版本号最新的&#xff0c;或者其他最新版本 阿里云下载 1-百度搜索&#xff1a;阿里云 2-找到开发者社区 3-找到下载&#xff0c;选择镜像 4-选择系统 5-点击镜像地…

vivado时序方法检查3

TIMING-7 &#xff1a; 相关时钟间无公共节点 时钟 <clock_name> 与 <clock_name> 之间相互关联 &#xff08; 一起定时 &#xff09;&#xff0c; 但两者间无公共节点。此设置在硬件中可能失败。要查找这些时钟之间的时序路径&#xff0c; 请运行以下命令 &a…

javascript 访问器属性创建的三种方式

出自 javascript高级程序设计-第六章6.1节 javascript 访问器属性创建的三种方式&#xff1a; 以下year字段都是访问器属性&#xff0c;_year、 edition是数据属性。 var book1 { _year: 2000, edition: 1 }; Object.defineProperty(book1, "year", { get: fun…

岚图追光PHEV 25.28万元起售,开卷混动豪华轿车

作者&#xff5c;Amy 编辑&#xff5c;德新 12月5日晚&#xff0c;2023岚图科技日上&#xff0c;岚图汽车正式发布了其新一代SOA电子电气架构天元架构&#xff0c;并宣布了以“新行政电动旗舰”为定位的岚图追光PHEV正式上市。 岚图追光PHEV是岚图汽车旗下首款电混轿车&#x…

selenium自动化测试:xpath八种定位方式!

01、前言 如果可以的话&#xff0c;请先关注&#xff08;专栏和账号&#xff09;&#xff0c;然后点赞和收藏&#xff0c;最后学习和进步。你的支持是我继续写下去的最大动力&#xff0c;个人定当倾囊而送&#xff0c;不负众望。谢谢&#xff01;&#xff01;&#xff01; 1.…

【springboot】整合redis和定制化

1.前提条件:docker安装好了redis,确定redis可以访问 可选软件: 2.测试代码 (1)redis依赖 org.springframework.boot spring-boot-starter-data-redis (2)配置redis &#xff08;3&#xff09; 注入 Resource StringRedisTemplate stringRedisTemplate; 这里如果用Autowi…

一台服务器能放多少个网站?

这个问题有点意思&#xff0c;确实是有不少用户会问到&#xff0c;但其实这个问题的真正意思是&#xff0c;一台服务器上面放多少个网站不卡&#xff0c;打开不慢 。其实这个问题又有点复杂&#xff0c;一台服务器放多少个网站不会卡&#xff0c;跟很多因素有关&#xff0c;比如…

docker安装及简单使用(Linux版本)

文章目录 前言一、docker安装二、docker命令pull&#xff08;安装镜像&#xff09;images&#xff08;查看镜像&#xff09;run&#xff08;创建容器&#xff09;删除容器exec&#xff08;进入运行中的容器&#xff09;常用命令 总结如有启发&#xff0c;可点赞收藏哟~ 前言 ht…

Python 进阶(十三):JSON 序列化和反序列化(json 模块)

大家好&#xff0c;我是水滴~~ 本篇文章主要介绍json模块的功能&#xff0c;包括将Python对象序列化到文件、将Python对象序列化为字符串、序列化时类型的对照表、将文件中JSON数据反序列化为Python对象&#xff0c;将JSON字符串反序列化为Python对象、反序列化时类型的对照表…

Python 模块的使用方法

Python 模块是一种组织和封装代码的方式&#xff0c;允许你将相关的功能和变量放在一个单独的文件中&#xff0c;以便在其他程序中重复使用。在Python中&#xff0c;模块是一种可执行的Python脚本&#xff0c;其文件扩展名为 .py。这里&#xff0c;我将详细讲解Python模块的使用…

2023中医药国际传承传播大会在深圳召开

12月2日&#xff0c;2023中医药国际传承传播大会在深圳召开&#xff0c;大会由世界针灸学会联合会、中新社国际传播集团、中国新闻图片网、中国民族医药学会、中国针灸学会主办&#xff0c;世界针灸学会联合会健康传播工作委员会、中新雅视文化发展有限公司公司与深圳巨邦传媒集…

播放pcap抓包文件中的amr-wb、amr-nb、evs声音

前言 由于wireshark并不能解析amr-wb、evs数据&#xff0c;所以也就没办法播放响应的音频。在遇到问题时&#xff0c;想还原抓包的数据是否正常就很难受。为了解决这个问题&#xff0c;我看了RFC4867&#xff0c;想着自己写一个解包小工具&#xff0c;最后彻底放弃。。感觉太复…

Qt Creator :Analyze heob 使用教程

功能&#xff1a;在windows系统上检测和调试软件代码的内存泄漏情况&#xff1b; 使用环境 &#xff1a;需要下载 heob和dwarfstack 把dwarfstack动态库放在heob的执行程序目录下 使用步骤&#xff1a; 第三步&#xff1a;配置启动调试程序 第四步&#xff1a;配置heob的路…

什么因素会影响葡萄酒陈酿的能力?

糖、酸和酚类与水的比例是葡萄酒陈酿程度的关键决定因素&#xff0c;收获前葡萄中的水分越少&#xff0c;产生的葡萄酒就越有可能具有一定的陈酿潜力。那么葡萄品种、气候和葡萄栽培实践的过程就相当重要了&#xff0c;对陈酿的时间发挥了重要的作用。皮较厚的葡萄品种&#xf…