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

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

1、基于 优先级队列/堆

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

以 key value 结构举例

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

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

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

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

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

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

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

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

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

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

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

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

目录
相关文章
|
2月前
|
监控 中间件 PHP
hyperf-alarm-clock,一个自动计算代码执行时间,超时并发送通知的小工具
`hyperf-alarm-clock` 是专为 Hyperf 框架设计的库,用于监控代码执行时间并在超时后发送通知。支持多种通知通道,如标准输出、日志文件和飞书。适用于需要确保响应及时性的系统,如电商平台订单处理流程监控。安装简单,配置灵活,是提高系统性能和稳定性的有力工具。
31 1
hyperf-alarm-clock,一个自动计算代码执行时间,超时并发送通知的小工具
|
4月前
|
前端开发 JavaScript
前端基础(十三)_定时器(间歇定时器、延迟定时器)
本文介绍了JavaScript中定时器的使用,包括`setTimeout`和`setInterval`两种类型。`setTimeout`是实现延迟执行,即等待一定时间后执行一次指定的函数;而`setInterval`是实现间歇执行,即每隔一定时间就执行一次指定的函数。文章还介绍了如何使用`clearTimeout`和`clearInterval`来取消定时器的执行,并通过示例代码展示了定时器的创建和取消。
139 4
前端基础(十三)_定时器(间歇定时器、延迟定时器)
|
3月前
|
数据采集 传感器
定时中断基本结构
【10月更文挑战第21天】定时中断是在微控制器或计算机系统中,按预设时间间隔自动触发中断请求的机制。它由定时器硬件模块(含计数器、时钟源、控制寄存器)、中断控制器(处理中断请求、设置优先级、中断屏蔽)和中断服务程序(保存现场、执行任务、恢复现场)组成,实现定时任务的精确执行。
|
7月前
|
Java
java线程池执行任务(一次任务、固定间隔时间任务等)
java线程池执行任务(一次任务、固定间隔时间任务等)
331 1
|
8月前
如何同时或者按顺序间隔启动多个程序
该内容是一个指南,介绍如何使用一个工具来设置定时启动程序。工具可以从百度网盘或蓝奏云下载,提取码分别为&qwu2"和"2r1z"。步骤包括:1) 打开工具并切换到定时器模块;2) 新建定时器并设置单次数量,例如设为1表示执行一次任务;3) 添加子事件,选择程序类型;4) 指定程序启动路径,如QQ;5) 复制QQ的启动路径并确认。通过增加子事件和调整单次数量,可实现同时启动多个程序。
|
存储 SQL 数据库
超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
690 0
AS执行时间计算
long start=System.currentTimeMillis();
60 0
|
传感器 芯片
使用系统定时器SysTick实现精确延时微秒和毫秒函数
使用系统定时器SysTick实现精确延时微秒和毫秒函数
456 0
使用系统定时器SysTick实现精确延时微秒和毫秒函数
|
算法 搜索推荐 C++
U3D客户端框架之小堆顶高性能定时器测试10W计时器耗时1.9ms
计时器使用小堆顶:计时器timeout时间取的是1-10w,cpu mian 平均 在1.6左右浮动,在雪崩(全部更新的情况)情况下 cpuMian会突然上升到9.6左右;