时间轮

作者: Fix12138 | 来源:发表于2019-05-19 22:22 被阅读0次

参考代码 hzlulu/TimingWheel

TimerTask

时间轮中任务类的抽象类。实现Runnable接口。
成员变量包括:

  • delayMs:超时的绝对时间
  • TimerTaskEntry:存放在时间轮中时,与之相关联的包装类,用于定时达到之前,取消任务。

TimerTaskEntry

时间格中存放的列表中的具体节点类,也是任务的包装类。实现了Comparable接口,根据每个Entry的expirationMs过期时间进行比较。
成员变量包括:

  • TimerTaskList:节点属于的时间格list
  • TimerTaskEntry next:指向下一个Entry
  • TimerTaskEntry pre:指向上一个Entry
  • TimerTask:包装的任务对象
  • expirationMs:到期时间

TimerTaskList

每个时间格表示的TimeTask列表,每个列表具有一个到期时间,当列表到期后,再将列表中的元素从新散布到时间格中。再散布的过程中会发现已经到期的任务,立即执行。
实现Delayed接口,提供getDelay方法返回给定单位的到期时间。
成员变量包括:

  • AtomicInteger taskCounter:列表中任务的个数
  • TimerTaskEntry root:列表的入口节点
  • AtomicLong expiration:列表的到期时间。这个时间根据tickMs粗化后的到期时间。例如,当tickMs为1ms时,到期时间就是任务的到期时间;当tickMs为2s时,两个相差1s的任务放在同一个时间格内时,设置list的到期时间是相同的。

TimingWheel

时间轮类。定义了整个时间轮的基本属性。
成员变量包括:

  • tickMs:时间格的单位
  • wheelSize:时间格的个数
  • interval:tickMs X wheelSize当前层时间轮的时间跨度
  • taskCounter:整个时间轮的任务数量
  • queue:时间格(TimerTaskList)按照到期时间组成的延时队列(在SystemTimer类的advanceClock中用来获取下一个时间格)
  • currentTime:时间轮的初始化时间
  • overflowWheel:高层时间轮
  • TimerTaskList[] buckets:时间格数组

SystemTimer

整个时间轮的包装和调用类。通过add方法向时间轮中添加任务。通过advanceClock方法驱动时间轮。

整个时间轮流程

初始化

SystemTimer systemTimer = new SystemTimer("name");

添加任务

  1. systemTimer.add(new DelayedOperation(100))
  2. 包装为TimerTaskEntry
  3. 向TimingWheel中添加
  4. 如果添加失败,则判断任务是否已经取消或者已经到期
  5. 如果任务到期则立即执行,taskExecutor.submit()

添加到时间轮的逻辑

  1. 判断任务是否已经取消
  2. 判断任务是否已经到期
  3. 如果到期时间在当前层时间轮的范围内,在计算对应的bucket天机
  4. 如果超出当前层的时间范围,则递归想高层时间轮继续添加

驱动时间轮

  1. systemTimer.advanceClock()
  2. 从当前层时间轮的延时队列中获取到期的TimeTaskList
  3. 修改时间轮的当前时间
  4. 将TimeTaskList中的任务继续添加到时间轮当中,此时会用到上一步修改的当前时间,来判断任务是否过期
  5. 对于过期任务直接执行,否则继续添加到时间轮中
  6. 继续从延时队列中获取到期的bucket,直到获取完。

相关文章

  • 时间轮

    参考代码 hzlulu/TimingWheel TimerTask 时间轮中任务类的抽象类。实现Runnable...

  • 时间轮

    https://zhuanlan.zhihu.com/p/102476356[https://zhuanlan.z...

  • 时间轮

    前言 时间轮是一个非常高效且低成本的计时算法,论文地址《Hashed and Hierarchical Timin...

  • 浅论时间轮

    基于时间轮的定时器 定时器的实现多采用最小堆,其创建和删除复杂度为O(logN),tick的复杂度为O(1);在极...

  • 时间之轮

    八点起床,手机没你的消息。在忙吧,反正也无话可说。我过我的生活,你享受你的人生,做你想做的事情,我们一点交集都没有...

  • 时间的轮

    时间的轮 碾碎了咆哮的嘴的牙 撕开了涨鼓的胸口的皮肉 风再吹进来 给赤裸的颤栗的心 去降温 去涂抹冷色调的漆 去掩...

  • kafka时间轮

    举个例子:第一层时间轮格数是10,每格表示1ms。第二层时间轮格数是20,每格表示上一层时间轮的总和:10*1ms...

  • 关于时间轮

    最近翻看了去哪儿的QMQ的关于延时队列的源码,主要就是想要了解它在延时队列上实现的设计方案。 1、延时消息投递到d...

  • 时间之轮

    《地球编年史》系列第五本,“当时间开始”,主要讲述的是“时间”这个概念在地球上出现的缘由、时间,“时间”又是如何被...

  • 时间轮足

    1后桌的故事 我一直搞不懂,小俊和我前后桌一年了,我们的关系也只是前后桌,而小艳才换过来挨着小俊坐了...

网友评论

      本文标题:时间轮

      本文链接:https://www.haomeiwen.com/subject/eejczqtx.html