定时器 在某个时间到达之后,执行指定的任务

简介: 本文介绍了两种实现定时器的方法:基于优先级队列(堆)和基于时间轮,以在指定时间到达后执行特定任务。

1、基于 优先级队列/堆

常的队列是先进先出
优先级队列则是按照指定的优先级,先出

以 key value 结构举例

队首元素,就是最早的要过期的 key

  • key1: 12:00
  • key2: 13:00
  • key3: 14:00

此时定时器中只需要分配一个线程,让这个线程去检查队首元素,看是否过期即可

如果队首元素还没过期,后续元素一定没过期!

此时扫描线程不需要遍历所有 key ,只盯住一个队首元素即可

另外在扫描线程检查队首元素过期时间的时候,也不能检查的太频繁

此时做法就是可以根据当前时刻和队首元素的过期时间,设置一个等待,当时间差不多到了,系统再唤醒这个线程

此时扫描线程不需要高频扫描队首元素,把CPU的开销也节省了下来

如果在线程休眠的时候,来了一个新的任务,是11:30要执行

可以在新任务添加的时候,唤醒一下刚才的线程,重新检查一下队首元素,再根据时间差距重新调整阻塞时间即可

2、基于时间轮实现的定时器

    把时间划分成很多小段(划分的粒度,看实际需求)

目录
相关文章
Cron表达式每隔两小时执行一次
Cron表达式每隔两小时执行一次
486 1
|
算法
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
405 0
|
JavaScript
vue中有关表格中的表格头中添加悬浮提示的ui问题
vue中有关表格中的表格头中添加悬浮提示的ui问题
328 0
|
JavaScript 前端开发
layui用layer.open打开子页面并获取子页面的ueditor富文本编辑器的内容
该内容描述了一个Web应用的交互流程,其中父页面通过调用子页面的JavaScript函数来获取富文本编辑器的内容。子页面包含一个富文本编辑器和一个`callbackdata`函数,用于返回编辑器的文本内容。父页面使用`layer.open`打开子页面作为弹窗,并在用户点击提交时,访问子页面的`callbackdata`获取编辑器内容,同时检查其他表单字段,如类型、标题等是否为空,以确保数据完整。
925 0
layUI数据表格可编辑表格单元格值修改之后获取修改前的值
layUI数据表格可编辑表格单元格值修改之后获取修改前的值
563 0
|
SQL 数据库 索引
阿里P8整理出SQL笔记:收获不止SOL优化抓住SQL的本质
开头我先说: 有人就有江湖,有江湖就有IT系统,有IT系统就有数据库,有数据库就有SQL,SQL应用可一字概括:“"广"。加之其简单易学,SQL实现也可一字概括:“乐”。
|
JavaScript
vue中有关表格中的表格头中添加悬浮提示的ui问题
vue中有关表格中的表格头中添加悬浮提示的ui问题
406 1
|
SQL 关系型数据库 MySQL
分享一个 .Net core Console 项目使用 SqlSugar 的详细例子
分享一个 .Net core Console 项目使用 SqlSugar 的详细例子
669 0
|
前端开发 JavaScript 测试技术
深入理解自动化测试框架:Selenium与Appium的比较
【5月更文挑战第29天】 在快速发展的软件行业中,自动化测试已成为保证软件质量和缩短发布周期的关键。本文深入分析了两个领先的自动化测试框架——Selenium和Appium,探讨了它们的核心原理、应用场景以及优缺点。通过细致的比较,为软件开发团队提供选择合适测试工具的参考依据,并强调了在不同环境下如何优化测试流程以提高测试效率和准确性。
|
11月前
|
消息中间件 存储 缓存
为什么 Kafka 的吞吐量那么高?
为什么 Kafka 的吞吐量那么高?
270 2

热门文章

最新文章