当前位置: 首页 > news >正文

多线程--模拟实现定时器--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添加任务也是一个线程,会出现线程安全问题所以我们应该加锁。 

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

三、简单测试定时器

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


http://www.mrgr.cn/news/66279.html

相关文章:

  • 损失函数的分类
  • 在路由引入时应用路由策略示例
  • Netty 常见组件介绍
  • 跳表原理笔记
  • vue3-ref 和 reactive
  • 【优选算法】——二分查找!
  • 了解分布式数据库系统中的CAP定理
  • 【初阶数据结构与算法】复杂度分析练习之轮转数组(多种方法)
  • 华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力2-管理AR会话
  • C++ 高效率整型大数运算项目优化——内置类型存储与计算
  • 数据结构——二叉树(续集)
  • 在Android开发中如何使用OCR获取当前屏幕中的文本?
  • Nop入门:极简AOP实现
  • Android问题 -- DJ多多的下载文件在哪里? DJ多多dat格式转换为mp3
  • LoRA(Low-Rank Adaptation)的工作机制 - 在 GPT-2 的注意力层中添加 LoRA 低秩适配器
  • Git遇到“fatal: bad object refs/heads/master - 副本”问题的解决办法
  • 基于 GADF+Swin-CNN-GAM 的高创新轴承故障诊断模型
  • 41.第二阶段x86游戏实战2-C++实现lua寻路
  • 基于STM32的自动化植物浇灌系统教学
  • 【Qt】使用Qt发送http请求封装一个通用类
  • 劫持微信聊天记录并分析还原 —— 解密数据库(二)
  • 工作中问题
  • 新一代跟踪器StrongSORT: Make DeepSORT Great Again论文解析—让 DeepSORT 再次伟大
  • nacos本地虚拟机搭建切换wiff问题
  • 基于SpringBoot的免税商品优选购物商城的设计与实现
  • 小美和大富翁