[JAVAEE] 多线程的案例(四) - 定时器

目录

一. 什么是定时器?

二. java中的定时器类

三. 定时器的简单使用.

四. 模拟实现定时器

4.1 实现 MyTimerTask

4.2 实现 MyTimer


一. 什么是定时器?

定时器相当于闹钟, 时间到了就执行一些逻辑.


二. java中的定时器类

使用Timer类实例化一个定时器对象.

Timer类中的核心方法: schedule(TimerTask, long);

TimerTask是一个抽象方法, 实现了Runnable接口, 重写了run抽象方法.


三. 定时器的简单使用.

    public static void main(String[] args) throws InterruptedException{Timer timer = new Timer();// lambda: 函数式接口, 接口中有且仅有一个抽象方法timer.schedule(new TimerTask() { // 匿名内部类@Overridepublic void run() {System.out.println(1000);}}, 1000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println(2000);}}, 2000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println(3000);}}, 3000);System.out.println("main");Thread.sleep(3000);timer.cancel(); // 终止timer中的前台线程}

cancel()方法用来终止timer类中的前台线程.


四. 模拟实现定时器

4.1 实现 MyTimerTask

class MyTimerTask implements Comparable<MyTimerTask> {private Runnable task;// 记录任务要执行的时刻private long time;public MyTimerTask(Runnable task, long time) {this.task = task;this.time = time;}@Overridepublic int compareTo(MyTimerTask o) {return (int) (this.time - o.time);// return (int) (o.time - this.time);}public long getTime() {return time;}public void run() {task.run();}
}

4.2 实现 MyTimer

class MyTimer {private PriorityQueue<MyTimerTask> queue = new PriorityQueue<>();// 直接使用 this 作为锁对象, 当然也是 ok 的private Object locker = new Object();public void schedule(Runnable task, long delay) {synchronized (locker) {// 以入队列这个时刻作为时间基准.MyTimerTask timerTask = new MyTimerTask(task, System.currentTimeMillis() + delay);queue.offer(timerTask);locker.notify();}}public MyTimer() {// 创建一个线程, 负责执行队列中的任务Thread t = new Thread(() -> {try {while (true) {synchronized (locker) {// 取出队首元素// 还是加上 whilewhile (queue.isEmpty()) {// 这里的 sleep 时间不好设定!!locker.wait();}MyTimerTask task = queue.peek();if (System.currentTimeMillis() < task.getTime()) {// 当前任务时间, 如果比系统时间大, 说明任务执行的时机未到locker.wait(task.getTime() - System.currentTimeMillis());} else {// 时间到了, 执行任务task.run();queue.poll();}}}} catch (InterruptedException e) {e.printStackTrace();}});t.start();}
}

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

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

相关文章

C++调试经验:Ubuntu下Qt工程链接常见库的方式(持续更新)

目录 1. Qt工程链接OpenCV库 2. Qt工程链接tinyxml库 3. Qt工程链接pugixml库 4. Qt工程链接geographiclib地理信息转换库 5. Qt工程链接gstreamer音视频流媒体处理库 6. Qt工程链接VTK三维可视化库 7. Qt工程链接PCL点云处理库 8. Qt工程链接json-cpp库 9. Qt工程链…

Vue学习笔记(十一)

一. Promise 1. 异步 异步&#xff1a;则是将耗时很长的A交付的工作交给系统之后&#xff0c;就去继续做B交付的工作&#xff0c;等到系统完成了前面的工作之后&#xff0c;再通过回调或者事件&#xff0c;继续做A剩下的工作。AB工作的完成顺序&#xff0c;和交付他们的时间顺…

江协科技STM32学习- P21 ADC模数转换器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

OpenAI放弃自制AI芯片!伦敦场开发者日Hugging Face工程师现场“拷问”Sam Altman

OpenAI 2024年开发者大会第二场&#xff08;伦敦场&#xff09;刚结束。 10月初在旧金山举办了第一场 OpenAI 开发者大会&#xff0c;但这次没有像上一场放出很多花活&#xff0c;这次开始走剧透局了&#xff01; 现场的OpenAI 产品主管 曝光了 GPT o1即将更新的功能&#xf…

浅谈网络安全

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 网络安全是确保信息系统、网络及数据免受未授权访问、使用、披露、篡改或破坏的重要领域。随着数字化进程的加速和互联网的普及&#xff0c;网络安全的重要性显著提升。今天&#xff0c;网络威胁呈现出多样化…

在面试了些外包以后,我有了些自己的思考

大家好&#xff0c;我是洋子&#xff0c;最近公司在降本增效&#xff0c;需要把外包从北京迁移到陕西的某新一线城市&#xff0c;其实就是变相裁员&#xff0c;减少外包的成本&#xff0c;裁掉现有的员工&#xff0c;重新招聘新人 在整个测试行业&#xff0c;外包测试的比重是…

文心一言 VS 讯飞星火 VS chatgpt (381)-- 算法导论24.5 1题

一、给出图24-2的与图中两棵最短路径树不同的另外两棵最短路径树。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在图论中&#xff0c;最短路径树&#xff08;Shortest Path Tree, SPT&#xff09;是一种从单个源点到所有其他节点的最短路径形成的树。给定一个…

Vscode配置CC++编程环境的使用体验优化和补充说明

文章目录 快速编译运行&#x1f47a;code runner插件方案Code Runner Configuration 直接配置 相关指令和快捷键默认task配置和取消默认 配置文件补充介绍(可选 推荐阅读)&#x1f60a;使用vscode预置变量和环境变量环境变量的使用使用环境变量的好处环境变量可能引起的问题 检…

Canvas简历编辑器-选中绘制与拖拽多选交互设计

Canvas简历编辑器-选中绘制与拖拽多选交互设计 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM&#xff0c;并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计。那么此时我们就依然在轻量级DOM的基础上&#xff0c;关注于实现选中绘制与拖拽多选交…

iQOO手机怎样将屏幕投射到MacBook?可以同步音频吗?

众所周知&#xff0c;苹果品牌的设备自己有AirPlay的投屏功能&#xff0c;iPhone要投屏到MacBook只要连接同一网络&#xff0c;然后开启AirPlay就可以投屏。但其他品牌的手机没有AirPlay&#xff0c;怎么将手机屏幕投射到MacBook呢&#xff1f; 安卓系统的手机可以使用无线投屏…

机器人和智能的进化速度远超预期-ROS-AI-

危机 通常&#xff0c;有危险也有机遇才称之为危机。 从2020年启动转型自救&#xff0c;到2021年发现危险迫在眉睫&#xff0c;直到2024年也没有找到自己满意的出路。 共识 中产阶级知识分子共有的特性和一致的推断。 200年前的推断&#xff0c;在如今得到了验证。 机器人…

Idea、VS Code 如何安装Fitten Code插件使用

博主主页:【南鸢1.0】 本文专栏&#xff1a;JAVA 目录 ​编辑 简介 所用工具 1、Idea如何安装插件 1.idea下载插件 2.需要从外部下载然后在安装&#xff0c; 2、VS Code如何安装插件 总结 简介 Fitten Code是由非十大模型驱动的AI编程助手&#xff0c;它可以自动生成代…

【Matlab】基础操作汇总

一、函数 1、定积分/不定积分函数&#xff1a;int int(f&#xff0c;[r&#xff0c;[x0&#xff0c;[x1]]]) f&#xff1a;所要积分的表达式&#xff1b; r&#xff1a;积分变量 若为定积分&#xff0c;则x0与x1为积分上下限。 2、求解非刚性微分方程&#xff1a;ode45 [t,y…

Mysql如何保证数据不会丢失,两阶段提交,redo log ,bin log的介绍

一、缓冲池 首先&#xff0c;关系型数据库是基于磁盘的&#xff0c;而非关系型数据库是基于内存的。 mysql就是一个基于磁盘的数据库&#xff0c;那么是如何减少mysql的i/o次数&#xff0c;提高mysql的性能呢。在mysql中是有一个缓冲池的&#xff0c;mysql每次查询时是按页进行…

学术论文排版的常见错误

文档对齐方式&#xff1a;国内的习惯一般是两侧对齐&#xff0c;这也是很多中文论文的排版格式要求。但对于英文论文来说&#xff0c;我来美国后发现的最大的一个差异就是老师发过来的文档都是左对齐&#xff0c;刚开始看着特别别扭&#xff0c;总感觉每行的最右边缺点什么。但…

助力抑郁症初筛!上海交大团队构建Agent心理诊所,论文一作在线展示demo,分享技术亮点

「我有动手打她&#xff0c;甚至好几次掐着她脖子把她按到墙角。每次动完手&#xff0c;我都会后悔&#xff0c;我为什么要动手&#xff0c;我为什么控制不住自己&#xff0c;我是不是就是一个混蛋、一个疯子、一个十恶不赦的人&#xff0c;但我真的不知道该怎么办。」这是 18 …

【优选算法篇】前缀之美,后缀之韵:于数列深处追寻算法的动与静

文章目录 C 前缀和详解&#xff1a;进阶题解与思维分析前言第二章&#xff1a;前缀和进阶应用2.1 和为 k 的子数组&#xff08;medium&#xff09;解法一&#xff08;前缀和 哈希表&#xff09;示例分析C代码实现易错点提示代码解读 2.2 和可被 K 整除的子数组&#xff08;med…

HTML基本类型

HTML基本类型 1.结构类型标签 UL ol liUL:是无序列表 type"none" 可以消除前面的黑点OL:是有序列表LI:可以包含流内容&#xff0c;如文本、图片或其他元素。​ 2.文本类型标签 b i s u pp:段落标签 只能放文本b:加粗标签 加粗文本i:斜体标签 文本斜体s:删除线标签 …

「Mac畅玩鸿蒙与硬件14」鸿蒙UI组件篇4 - Toggle 和 Checkbox 组件

在鸿蒙开发中,Toggle 和 Checkbox 是常用的交互组件,分别用于实现开关切换和多项选择。Toggle 提供多种类型以适应不同场景,而 Checkbox 支持自定义样式及事件回调。本篇将详细介绍这两个组件的基本用法,并通过实战展示它们的组合应用。 关键词 Toggle 组件Checkbox 组件开…

Unity计算二维向量夹角余弦值和正弦值的优化方法参考

如果不考虑优化问题&#xff0c;计算两个向量的余弦值或者正弦值可以直接使用类似的方法&#xff1a; [SerializeField] Vector2 v1, v2;void Start() {float valCos Mathf.Acos(Vector2.SignedAngle(v1, v2));float valSin Mathf.Asin(Vector2.SignedAngle(v1, v2)); } 但是…