序言
这种算法是一种轮询算法的优化升级,能够以只有一个Timer的情况下处理大量的定时任务.
Begin
结合HashedWheelTimer的思想根据自然时间1分钟为例,来做大批量的定时任务触发
首先定一个长度为60的数组,数组中存放的是Set集合,集合里面是任务详情.
当有定时任务刚来的时候判断是否将要在未来1分钟内出发,如果是则根据出发时间的秒数放入指定的数组Set中
创建定时任务,每秒钟执行一次,根据当前执行的时间的秒数来处理对应的数组对象,比如当前是52秒就获取数组下标[51] 来处理Set中的任务,处理完成就清空Set
关于Set中的任务可以使用多线程进行,Timer线程只负责轮询
不同的业务可以创建多个时间轮,以减轻压力.
未放入Set时间轮的任务可以先放入队列中,当然队列也可以根据任务类型创建多个如此这样在判断在将来1分钟内要执行的任务就放入时间轮.
另
Netty提供了HashedWheelTimer的实现,参考:https://www.cnblogs.com/yangyongjie/p/15839713.html
Java Timer是轮询的方式实现的,参考:https://juejin.cn/post/6844903741565435918
XXL-JOB也利用了时间轮,参考:https://juejin.cn/post/6976412313981026318