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

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

1、基于 优先级队列/堆

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

以 key value 结构举例

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

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

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

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

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

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

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

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

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

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

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

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

目录
相关文章
|
6月前
Cron表达式每隔两小时执行一次
Cron表达式每隔两小时执行一次
266 1
|
Linux 调度
按键消抖的两种方法--中断延迟工作与定时器
按键消抖的两种方法--中断延迟工作与定时器
654 0
|
2月前
|
前端开发 JavaScript
前端基础(十三)_定时器(间歇定时器、延迟定时器)
本文介绍了JavaScript中定时器的使用,包括`setTimeout`和`setInterval`两种类型。`setTimeout`是实现延迟执行,即等待一定时间后执行一次指定的函数;而`setInterval`是实现间歇执行,即每隔一定时间就执行一次指定的函数。文章还介绍了如何使用`clearTimeout`和`clearInterval`来取消定时器的执行,并通过示例代码展示了定时器的创建和取消。
77 4
前端基础(十三)_定时器(间歇定时器、延迟定时器)
|
5月前
|
Java
java线程池执行任务(一次任务、固定间隔时间任务等)
java线程池执行任务(一次任务、固定间隔时间任务等)
281 1
|
5月前
|
运维 Java Serverless
函数计算产品使用问题之是否会受执行超时时间的限制
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
12月前
|
小程序 前端开发 JavaScript
小程序计时器
小程序计时器
137 0
wustojc2011计算终止时间
wustojc2011计算终止时间
38 0
|
存储 SQL 数据库
超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
560 0
AS执行时间计算
long start=System.currentTimeMillis();
55 0