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

定时器的两种实现方式

1、基于优先级队列/堆

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

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

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

2、基于时间轮

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

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

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

http://www.xdnf.cn/news/564013.html

相关文章:

  • C语言---结构体 、联合体、枚举
  • JavaScript性能优化实战(14):跨端JavaScript性能优化
  • ​C++性能优化的7大核心策略与实战案例
  • qt浏览文件支持惯性
  • AI赋能R-Meta分析核心技术:从热点挖掘到高级模型
  • 【音频】wav文件如何解析编码格式(压缩格式)?
  • 前端开发遇到 Bug,怎么办?如何利用 AI 高效解决问题
  • 电脑中所有word文件图标变白怎么恢复
  • WebSocket 是什么?
  • SQL 数值计算全解析:ABS、CEIL、FLOOR与ROUND函数深度精讲
  • 深入了解redis的哈希槽的知识
  • 关于收集 Android Telephony 网络信息的设计思考
  • 网络基础的介绍
  • 如何提高独立服务器的安全性?
  • 从电商角度设计大模型的 Prompt
  • Java 参数值传递机制
  • 全平台开源电子书阅读器推荐,支持多端同步+AI朗读!支持epub/mobi/azw3/pdf常见电子书格式!
  • PostgreSQL基础操作
  • 29.第二阶段x64游戏实战-技能冷却
  • Node.js 24发布:性能与安全双提升
  • 【Vue篇】重剑无锋:面经PC项目工程化实战面经全解
  • 苹果企业签名为什么会出现授信异常
  • 《从虚拟 DOM 到 Diff 算法:深度解析前端高效更新的核心原理》-简版
  • logits是啥、傅里叶变换
  • day 32
  • 谷歌I/O 2025 完全指南:由Gemini开创的AI新时代及其对我们未来的影响
  • DevExpress Blazor中文教程 - 如何用AI聊天组件构建大型语言模型聊天APP?
  • vscode连接本地Ubuntu
  • OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市
  • SpringCloud(二)