1。什么是时间轮时间轮简单理解就是用来存放计时任务的环形数组。它的工作原理类似于时钟的表盘。它由两部分组成,一是环形数组,二是遍历环形数组的指针。首先定义一个定长的圆形数组,然后数组的每个元素代表一个时间刻度。假设每个刻度之间的间隔是1s,那么一个长度为8的数组就代表8秒。然后是一个指针,顺时针无限循环数组,每1个最小时间单位递增一个数组索引。指针转动一圈代表8秒,转动两圈代表16秒。假设从0:00:00秒开始,转一圈后会到0:00:09秒。2.工作原理时间轮,环形数组中的每一个元素,是一个存放定时任务的容器。当我们在时间轮中添加一个定时任务时,我们会根据定时任务的执行时间来计算它的时间。存储数组索引。当然,在某个时间尺度上可能存在多个定时任务,此时会使用一个双向链表来存储。当指针指向一个数组时,会取出数组中存储的任务,然后遍历链表,将其中的任务一个一个运行。如果某个定时任务的执行时间大于环形数组所代表的长度,一般可以用一个环形数来表示该任务延迟执行的时间。比如第16秒要执行的任务,就是说这个任务应该在第2圈的数组下标为0的位置执行。3.优缺点分析利用时间的好处有很多轮来管理多个计划任务。我觉得还有两个比较重要的好处:(1)降低定时任务的增删时间复杂度,提高性能。(2)可以保证定时器任务每次执行的复杂度为O(1)。在密集型定时器任务的情况下,性能优势非常明显。当然,时间轮也有缺点。对于执行时间非常严格的任务,时间轮不是很合适,因为时间轮算法的精度取决于最小时间单元的粒度。假设以1s作为时间尺度,小于1s的任务是不能被时间轮调度的。时间轮算法在很多框架中都有使用,比如Dubbo、Netty、Kafka等,时间轮算法也是比较经典的设计。使用范围比较广,但是在实际应用中,大部分同学接触的很少。我觉得这样的设计思路或者说这样的数据结构在我们实际应用的一些特定场景中也可以借鉴和使用。如定时重试、衰减重试等。
