提示:学习笔记 欢迎指点
一、解决什么问题?
时间轮是一种高效来利用线程资源来进行批量化调度的一种调度模型。把大批量的调度任务全部都绑定到同一个的调度器上面,使用这一个调度器来进行所有任务的管理(manager),触发(trigger)以及运行(runnable)。能够高效的管理各种延时任务,周期任务,通知任务等等。
不过,时间轮调度器的时间精度可能不是很高,对于精度要求特别高的调度任务可能不太适合。因为时间轮算法的精度取决于,时间段“指针”单元的最小粒度大小,比如时间轮的格子是一秒跳一次,那么调度精度小于一秒的任务就无法被时间轮所调度。
二、执行原理
任务的执行原理:
时间轮算法可以通过上图来描述。假设时间轮大小为10,1s转一格,每格指向一个链表,保存着待执行的任务。
假设,当前位于1,现在要添加一个3s后指向的任务,则1+3=4,在第4格的链表中添加一个节点指向任务即可,标识round=0(round表示圈数)。
假设,当前位于1,现在要添加一个10s后指向的任务,则(1+10)% 10 = 1,则在第1格添加一个节点指向任务,并标识round=1(round表示圈数),则当时间轮第二次经过第1格时,即会执行任务。
时间轮只会执行round=0的任务,并会把该格子上的其他任务的round减1。
三、一个圆形可以处理任何时间跨度
之所以使用环形的数据结构,主要是处理时间跨度很大的问题。假如我们1s是一个时间段,一天24小时,我们需要划分246060=86400个区间,如果是1个月呢。显然环形结构可以很优雅的处理该问题。
如图我们认为这是一个周期为12秒的圆形,每个数字间隔是1s。我们要表示60s就是60/12=5。也就是指针从12开始转5圈。由此可见,一个圆形可以处理任何时间跨度。