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

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

1、基于 优先级队列/堆

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

以 key value 结构举例

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

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

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

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

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

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

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

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

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

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

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

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

目录
相关文章
|
5月前
递归执行的时候使用一次性还是永久性定时器?
递归执行的时候使用一次性还是永久性定时器?
|
5月前
Cron表达式每隔两小时执行一次
Cron表达式每隔两小时执行一次
229 1
|
13天前
|
前端开发 JavaScript
前端基础(十三)_定时器(间歇定时器、延迟定时器)
本文介绍了JavaScript中定时器的使用,包括`setTimeout`和`setInterval`两种类型。`setTimeout`是实现延迟执行,即等待一定时间后执行一次指定的函数;而`setInterval`是实现间歇执行,即每隔一定时间就执行一次指定的函数。文章还介绍了如何使用`clearTimeout`和`clearInterval`来取消定时器的执行,并通过示例代码展示了定时器的创建和取消。
18 4
前端基础(十三)_定时器(间歇定时器、延迟定时器)
|
4月前
|
Java
java线程池执行任务(一次任务、固定间隔时间任务等)
java线程池执行任务(一次任务、固定间隔时间任务等)
164 1
|
4月前
|
运维 Java Serverless
函数计算产品使用问题之是否会受执行超时时间的限制
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
11月前
|
小程序 前端开发 JavaScript
小程序计时器
小程序计时器
123 0
wustojc2011计算终止时间
wustojc2011计算终止时间
36 0
AS执行时间计算
long start=System.currentTimeMillis();
52 0
|
算法 搜索推荐 C++
U3D客户端框架之小堆顶高性能定时器测试10W计时器耗时1.9ms
计时器使用小堆顶:计时器timeout时间取的是1-10w,cpu mian 平均 在1.6左右浮动,在雪崩(全部更新的情况)情况下 cpuMian会突然上升到9.6左右;