如何实现定时任务?
可能立马想到:
- 搞个线程轮询任务,校验任务执行时间,如果到了就执行
这样效率比较低,所以优化有可以是:
- 基于最小堆,按照任务的执行时间戳进行堆排序,Timer和ScheduledThreadPool就是采用这种方法
有没有更加优雅的方法?
时间轮算法
算法概述
假如有三个需要定时执行任务,分别在5s,15s,30s时刻执行,那么可以搞一个长度为30的数组,把三个任务按照执行时刻对应下标的方法进行存放。
这样只需要一个线程去每过一秒去遍历数组的一个元素接口,当时间到5s时,线程也遍历到了对应的数组元素,执行即可。
圈数
假如100000s的任务定时执行呢,就得申请长度为100000的时间轮,所以可以拓展一个圈数的概念,也就是搞个循环数组,申请固定大小的任务,取模放到任务数组中即可。
比如申请30大小的数组,那么1和31任务都可以放到下标为1的数组(假设数组从1开始算下标)。

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

被折叠的 条评论
为什么被折叠?



