1礁遣、什么是時鐘輪斑芜?
這個問題也不難解決,我們只要找到一種方式祟霍,減少額外的掃描操作就行了杏头。比如我的一批定時任務(wù)是 5 秒之后執(zhí)行盈包,我在 4.9 秒之后才開始掃描這批定時任務(wù),這樣就大大地節(jié)省了 CPU大州。這時我們就可以利用時鐘輪的機(jī)制了续语。我們先來看下我們生活中用到的時鐘。
很熟悉了吧厦画,時鐘有時針疮茄、分針和秒針,秒針跳動一周之后根暑,也就是跳動 60 個刻度之后力试,分針跳動 1 次,分針跳動 60 個刻度排嫌,時針走動一步畸裳。而時鐘輪的實(shí)現(xiàn)原理就是參考了生活中的時鐘跳動的原理
在時鐘輪機(jī)制中,有時間槽和時鐘輪的概念淳地,時間槽就相當(dāng)于時鐘的刻度怖糊,而時鐘輪就相當(dāng)于秒針與分針等跳動的一個周期,我們會將每個任務(wù)放到對應(yīng)的時間槽位上颇象。時鐘輪的運(yùn)行機(jī)制和生活中的時鐘也是一樣的伍伤,每隔固定的單位時間,就會從一個時間槽位跳到下一個時間槽位遣钳,這就相當(dāng)于我們的秒針跳動了一次扰魂;時鐘輪可以分為多層,下一層時鐘輪中每個槽位的單位時間是當(dāng)前時間輪整個周期的時間蕴茴,這就相當(dāng)于 1 分鐘等于 60 秒鐘劝评;當(dāng)時鐘輪將一個周期的所有槽位都跳動完之后,就會從下一層時鐘輪中取出一個槽位的任務(wù)倦淀,重新分布到當(dāng)前的時鐘輪中蒋畜,當(dāng)前時鐘輪則從第 0 槽位從新開始跳動,這就相當(dāng)于下一分鐘的第 1 秒撞叽。為了方便你了解時鐘輪的運(yùn)行機(jī)制百侧,我們用一個場景例子來模擬下,一起看下這個場景能扒。假設(shè)我們的時鐘輪有 10 個槽位佣渴,而時鐘輪一輪的周期是 1 秒,那么我們每個槽位的單位時間就是 100 毫秒初斑,而下一層時間輪的周期就是 10 秒辛润,每個槽位的單位時間也就是 1 秒,并且當(dāng)前的時鐘輪剛初始化完成,也就是第 0 跳砂竖,當(dāng)前在第 0 個槽位真椿。
現(xiàn)在我們有 3 個任務(wù),分別是任務(wù) A(90 毫秒之后執(zhí)行)乎澄、任務(wù) B(610 毫秒之后執(zhí)行)與任務(wù) C(1 秒 610 毫秒之后執(zhí)行)突硝,我們將這 3 個任務(wù)添加到時鐘輪中,任務(wù) A 被放到第 0 槽位置济,任務(wù) B 被放到第 6 槽位解恰,任務(wù) C 被放到下一層時間輪的第 1 槽位,如下面這張圖所示浙于。
當(dāng)任務(wù) A 剛被放到時鐘輪护盈,就被即刻執(zhí)行了,因?yàn)樗环诺搅说?0 槽位羞酗,而當(dāng)前時間輪正好跳到第 0 槽位(實(shí)際上還沒開始跳動腐宋,狀態(tài)為第 0 跳);600 毫秒之后檀轨,時間輪已經(jīng)進(jìn)行了 6 跳胸竞,當(dāng)前槽位是第 6 槽位,第 6 槽位所有的任務(wù)都被取出執(zhí)行参萄;1 秒鐘之后卫枝,當(dāng)前時鐘輪的第 9 跳已經(jīng)跳完,從新開始了第 0 跳拧揽,這時下一層時鐘輪從第 0 跳跳到了第 1 跳剃盾,將第 1 槽位的任務(wù)取出腺占,分布到當(dāng)前的時鐘輪中淤袜,這時任務(wù) C 從下一層時鐘輪中取出并放到當(dāng)前時鐘輪的第 6 槽位;1 秒 600 毫秒之后衰伯,任務(wù) C 被執(zhí)行铡羡。