浅析时间轮算法

时间轮算法详解

如何实现定时任务?

可能立马想到:

  1. 搞个线程轮询任务,校验任务执行时间,如果到了就执行

这样效率比较低,所以优化有可以是:

  1. 基于最小堆,按照任务的执行时间戳进行堆排序,Timer和ScheduledThreadPool就是采用这种方法

有没有更加优雅的方法?

时间轮算法

算法概述

假如有三个需要定时执行任务,分别在5s,15s,30s时刻执行,那么可以搞一个长度为30的数组,把三个任务按照执行时刻对应下标的方法进行存放。

这样只需要一个线程去每过一秒去遍历数组的一个元素接口,当时间到5s时,线程也遍历到了对应的数组元素,执行即可。

圈数

假如100000s的任务定时执行呢,就得申请长度为100000的时间轮,所以可以拓展一个圈数的概念,也就是搞个循环数组,申请固定大小的任务,取模放到任务数组中即可。

比如申请30大小的数组,那么1和31任务都可以放到下标为1的数组(假设数组从1开始算下标)。

在这里插入图片描述

时/分/秒 时间轮算法

秒的粒度还是太大,可以考虑采用时/分/秒带反馈时间轮,即对于23时:48分:15秒需要执行的定时任务,设置三个时间轮,这个任务最开始放到时级时间轮的第23格子,当线程按照时间走到23时的时候,再把这个任务放到分级时间轮,以此类推,最后放到秒级时间轮即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值