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

定时器的两种实现方式

1、基于优先级队列/堆

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

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

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

2、基于时间轮

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

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

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

http://www.lryc.cn/news/2382128.html

相关文章:

  • Python、Pytorch、TensorFlow、Anconda、PySide、Jupyter
  • [Java实战]Spring Boot整合MinIO:分布式文件存储与管理实战(三十)
  • MacBook Air A2179(Intel版)安装macOS Catalina所需时间
  • AI在人力资源领域的应用:把握时代浪潮
  • 【VxWorks 实时操作系统(RTOS)】常用函数汇总
  • vr制作公司提供什么服务?
  • 下一代电子电气架构(EEA)的关键技术
  • matlab慕课学习3.5
  • 大语言模型(LLM)如何通过“思考时间”(即推理时的计算资源)提升推理能力
  • Ollama 如何在显存资源有限的情况下合理分配给不同的服务?
  • Qt音视频开发过程中一个疑难杂症的解决方法/ffmpeg中采集本地音频设备无法触发超时回调
  • 基于注意力机制与iRMB模块的YOLOv11改进模型—高效轻量目标检测新范式
  • PEFT库PromptTuningConfig 配置
  • 操作系统----软考中级软件工程师(自用学习笔记)
  • SQL 多表关联与分组聚合:解密答题正确率分析
  • 基于 Redis 实现短信验证码登录功能的完整方案
  • 电平匹配电路
  • JavaScript 日志和调试工具箱-logger2js
  • GitHub 自动认证教程
  • zData X zStorage 为什么采用全闪存架构而非混闪架构?
  • 鸿蒙OSUniApp 实现精美的轮播图组件#三方框架 #Uniapp
  • 解决git中断显示中文为八进制编码问题
  • SQL次日留存率计算精讲:自连接与多字段去重的深度应用
  • 使用SQLite Studio导出/导入SQL修复损坏的数据库
  • LSTM-Attention混合模型:美债危机与黄金对冲效率研究
  • 了解 DDD 吗?DDD 和 MVC 的区别是什么?
  • Unity3D仿星露谷物语开发46之种植/砍伐橡树
  • STM32外设应用详解——从基础到高级应用的全面指南
  • 作业帮C++后台开发面试题及参考答案
  • 红队进阶实战