大话时间轮算法的原理
2021-09-19 18:17:41 42 举报
让你看了就懂的时间轮算法!
作者其他创作
大纲/内容
四、这任务啥的都有了,那怎么就能2秒后又吃饼干又喝阔落呢?老哥,你是想问表针怎么走吧,现实中我们知道,那程序怎么模拟表针移动呢?
1
DrinkColaTask
4
PDDTask
7
...
5
8
2
6
eatCookieTask
3
GotoWCTask
三、你转念一想,不对,我只吃饼干不得噎死,2秒后还要喝口阔落!依旧简单,我们还在4秒的位置后面接一个喝阔落的任务(DrinkColaTask)
有点意思了吧,里面整个链表,把任务塞进去就完事了
十二、那我们已经清楚了秒针的任务如何到点执行,分针的任务如何到点执行呢?这里有一个降级处理:首先分针的行走肯定是需要一个单独的sleep(8),如此秒针每走一圈,分针便走一格。对吧,这个很好理解,但是,这里另一个关键点来了!当分针走到1的时候是不是刚过8秒,分针发现已经有一个任务在1栏位下,但是这个任务是10秒后才执行啊!!!!别急,我们肯定知道这个任务10秒(因为是我自己插入进去的嘛)所以10-8=2,我们将PDD这个任务降级移动到秒针盘里当前指针后两格的位置!这样等再过2秒,不就被秒针盘扫描到执行了吗!!所以除了秒针盘的任务会被实际执行,其他高级盘只存放计时!
七、虽然老哥没问,但是这里我还是想提一嘴!你看我们两秒后要执行的任务不是放在下标为2的那一栏,而是放在下标为4的那一栏!原因很简单,因为我们决定放哪里其实永远要参考当前表针的位置,老哥可以看到当前在第二秒,所以2秒后是第四秒,这个如果要实现很容易就混淆了
... ...
时间轮算法:我愿称之为表算法,说什么时间轮,其实就是一个表!当然主要是用来处理一些延时任务的,比如你10分钟之后要去领一个快递、15分钟后要去一趟厕所、16分钟后吃饱 ... 等等。没错,其实就是一个高效率的定时器!算法来源于生活,却高于生活!
十一、这个时候大家缓一缓,放慢脚步想一想,总结下。其实我们可以得到一个下面简单的结论:根据任务的延时时长可以推算出来:1. 当Task的 delay < 8,则放到秒针盘指定数组节点中; 2. 当Task的 8 =< delay <16,则放到分针盘的当前分针的下一格;3. 以此类推,如果 16 =< delay <24,则放到分针盘的下两格位置 。。。
老哥,最简单的方法,搞一个while(true)死循环,里面Thread.sleep(1000)每次都睡眠1秒,如果每次线程醒了是不是就过了1秒了呢?(滑稽),这个是给个参考,做法很多哈。
AnyTask
分针盘的任务到点会被降级移动到秒针盘里被执行
九、这个时候有机智的表哥想到了,表盘不仅有秒针,还有分针和时针啊!我们也整一个分针不就行了吗?表哥,你真厉害!没错。整起来!下面的黄蓝底的为分针盘,当前分针处于第八格到位置(我随便放的,看你心情。。。)
二、如果此时我需要在2秒后吃一块饼干,怎么办呢?很简单,currentTime = 2,所以我们在2+2=4 的位置插入一个吃饼干的任务(EatCookieTask)
八、有机智的老哥可能会问了,如果我要10秒后抢PDD咋办呢?哎,按照前面的逻辑往前数10次发现也是落在了第4栏,不能啊,那表针走到了第四栏咋判断是要吃饼干还是要PDD呢?
那我们开始说说这个表!
直接放后面?不合理吧!
一、首先想想我们现实中的表盘说明:箭头表示当前的表针所处的位置,一格代表1秒,当前处于第二秒的位置
十三、到这里,相信各位老哥已经完完全全的搞懂了时间轮到底是怎么玩的了,如果老哥有一个1小时之后的任务当前盘肯定是“装不下”,so easy 再整一个间隔更久的盘不就行了吗。嘿嘿!可真谓是“大珠小珠落玉盘”呀!不过,当然本身我这里知识介绍原理,比如你到底怎么模拟秒针、分针、时针的行走不会用sleep这种方式,可以自己想想或者上网查查有哪些方式,毕竟轮子很多。。。
五、“不对啊?”老哥你肯定想问我,如果我3秒后要上厕所,那到了第四秒怎么把饼干和阔落的任务取出来而不会把上厕所的任务取出来呢?不能提前上啊。。。
关键来了!PDD放哪里呢???
为啥不放在分针[2],而是放在分针[1]呢,因为分针 的一格是8秒,两格是16秒,而我们的任务没有到16秒
当然,这里抽象下,60格太难画了,我们假设一共8格
至此,我们多层时间轮也说完了,相信各位老哥肯定是手痒难耐,想自己写一个出来,那还吵吵啥呢,写起来吧!(手动滑稽)感谢观看!!!
十、其实有些老哥已经想到了,秒针一圈是8秒,那么超过8秒的肯定用秒盘无法存储了,所以需要放到分针盘!PDD砍一刀任务是10秒,超过8秒2秒,所以我们放到分针盘1的位置!同理我们也要有一个分针任务数组来放任务。
0 条评论
下一页