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

定时器的两种实现方式

1、基于优先级队列/堆

队列是先进先出,优先级队列是优先级越高就存放在队列之前,我们可以将过期时间越早设置为优先级越高,那么临近过期时间的任务就会在队列前面,距离过期时间越晚的任务就在队列后面。

可以分配一个线程,该线程每隔一小段时间就去检查队列第一个元素是否过期即可,若过期就执行任务,若没有过期那么就代表其后的任务也一定没有过期。剩余的时间这个线程就处于休眠状态,时间间隔到了就唤醒线程。

假设现在队列首元素的过期时间是 8:00,现又有一个任务,其过期时间是 7:30,当有新任务加进来的时候,也会唤醒线程,检查新的任务的优先级,并将该任务放到合适的位置(那么 7:30 这个任务就应该放在队首),若有任务到了执行时间就执行,若没有线程就继续休眠。

2、基于时间轮

时间轮就是将一个轮盘每隔一个间隔就划分为一个区域,这个间隔代表了一段时间,并给每个区域编号。如下图所示:

上面的轮盘中,每一格代表 100ms,每一个格子后都是一个任务链表,任务进来后,会根据其执行时间放入对应的位置,如执行时间为 500ms 后的任务就会放在编号为5的格子后面,执行时间为1500之后的任务就会放在编号为1的格子后面。

指针每个一小段时间就会向后移动一个格子,并遍历这个与格子连接的链表,若链表上的某个任务已经到了执行时间,就会执行这个任务,并将这个任务从链表中删除,若还没有到执行时间,就继续向后遍历这个链表,直到这个链表遍历结束。

相关文章:

  • AI人工智能——Matplotlib绘制各种数据可视化图表的基础方法
  • Idea 查找引用jar包依赖来源的Maven pom坐标
  • 软考高项-各年选择错题
  • Sentieon文献解读 - 使用 Sentieon ctDNA 分析管道高精度、高效地处理 UMI 数据集
  • React--函数组件和类组件
  • 打卡31天
  • Docker的网络介绍
  • linux 查看java的安装路径
  • java并发-线程池
  • gcc还会有自己的头文件呢?
  • 【信息系统项目管理师】第13章:项目资源管理 - 38个经典题目及详解
  • 使用allure生成自动化测试报告
  • systick滴答定时器us延时和毫秒延时
  • 大模型训练全攻略:从参数设置到模型优化
  • FreeCAD傻瓜教程-外螺纹的绘制,利用两个实体进行布尔运算来实现
  • 滚珠丝杆的承载力是多少?
  • HarmonyOS基础组件:Button三种类型的使用
  • Pandoc3.7新特性:存在合并单元格的 HTML 表格会被保留为嵌入的 HTML 表格
  • Ulisses Braga-Neto《模式识别和机器学习基础》
  • 微信小游戏流量主广告自动化浏览功能案例5
  • 泰安公司网站开发/如何注册百度账号