今天看到一段有意思的代碼:Thread.sleep(0),下面就來(lái)分析一下這串看似無(wú)用的代碼到底有沒(méi)有用。
Thread.sleep(0)到底是個(gè)什么騷操作,這睡0毫秒和不睡有什么區(qū)別嗎?
操作系統(tǒng)資源的分配策略
想要去了解多線程,就先要去了解操作系統(tǒng)中資源的不同分配策略在操作系統(tǒng)中,CPU資源的分配策略有多種,下面就拿兩種最為典型的策略舉例:
時(shí)間片算法
基于時(shí)間片算法分配資源的代表就是Unix系統(tǒng)。在時(shí)間片算法中,操作系統(tǒng)會(huì)維護(hù)一個(gè)隊(duì)列,將所有的進(jìn)程放入隊(duì)列中。然后操作系統(tǒng)會(huì)按照隊(duì)列中的進(jìn)程順序?yàn)樗麄兎峙鋵儆谧约旱倪\(yùn)行時(shí)間,也就是說(shuō),操作系統(tǒng)給A進(jìn)程分配n毫秒時(shí)間,那么A進(jìn)程在本次排隊(duì)時(shí)只可以運(yùn)行n毫秒。
當(dāng)A進(jìn)程運(yùn)行完n毫秒后,操作系統(tǒng)不管A是否運(yùn)行完畢都會(huì)把運(yùn)行權(quán)限強(qiáng)行剝奪,交給隊(duì)列里面的下一個(gè)進(jìn)程去執(zhí)行,然后A進(jìn)程繼續(xù)去隊(duì)列尾部進(jìn)行下一次排隊(duì)。(這里,如果A在n毫秒之前提前結(jié)束或者被阻塞,操作系統(tǒng)會(huì)立即收回A的運(yùn)行權(quán)限)
舉個(gè)例子:
你去食堂買飯,這種模式就是食堂會(huì)強(qiáng)制你去排隊(duì),而且每人只有十分鐘點(diǎn)餐時(shí)間,一旦過(guò)了這個(gè)時(shí)間你就要重新去排隊(duì)。
搶占式
基于搶占式分配資源的代表是Winodws系統(tǒng)。搶占式的操作系統(tǒng)都是“儒家學(xué)派”的,默認(rèn)每個(gè)進(jìn)程都是“君子”。意思就是:一個(gè)進(jìn)程一旦拿到CPU后,除非它主動(dòng)放棄CPU權(quán)限,不然別的進(jìn)程是拿不到CPU權(quán)限的。
然后操作系統(tǒng)在選取執(zhí)行權(quán)限的時(shí)候也不是隨機(jī)選的,它會(huì)根據(jù)優(yōu)先級(jí)和饑餓時(shí)間來(lái)判定誰(shuí)更需要CPU權(quán)限的。每次一個(gè)進(jìn)程是釋放CPU后,就會(huì)進(jìn)行一次優(yōu)先級(jí)評(píng)定。也就是說(shuō),如果運(yùn)氣好,每次都會(huì)被選中。
舉個(gè)例子:
你去食堂買飯,食堂阿姨看你小伙子挺帥就先給你盛飯。然后給你盛完飯?jiān)龠x一次,又發(fā)現(xiàn)你這小伙子越看越順眼,就再給你一碗。
關(guān)于Sleep
拿搶占式來(lái)說(shuō)。去食堂吃飯,阿姨看小伙子挺不錯(cuò),三番五次的給你盛飯,但是你已經(jīng)吃飽了,這時(shí)候你就會(huì)告訴阿姨我吃飽了,接下來(lái)半小時(shí)不要再給我盛飯了。
對(duì)應(yīng)到代碼里就是,A最近30min不想再參與資源選舉了,這時(shí)它就會(huì)sleep(30 * 60 * 1000),然后操作系統(tǒng)就會(huì)進(jìn)行再次選舉,并且未來(lái)半小時(shí)A不參與選舉。此時(shí)當(dāng)A醒來(lái)之后,或許CPU執(zhí)行權(quán)在另一個(gè)進(jìn)程手里。
再說(shuō)Thread.sleep(0)
假如A執(zhí)行了一段時(shí)間后,突然想起來(lái)其他小伙伴可能也需要CPU執(zhí)行權(quán)限,不能光自己一個(gè)人霸占這個(gè)CPU,但是又沒(méi)辦法主動(dòng)申請(qǐng)?jiān)俅芜x舉,就只能退而求其次執(zhí)行Thread.sleep(0),在A有執(zhí)行權(quán)限的情況下執(zhí)行,執(zhí)行后告訴操作系統(tǒng),我要休息0毫秒,你接下來(lái)0毫秒內(nèi)的選舉就不要選我啦。但是操作系統(tǒng)下次再選舉的時(shí)候還是會(huì)把A算進(jìn)去,因?yàn)?毫秒已經(jīng)過(guò)了。
總結(jié)
Thread.sleep(0)不光有用,而且有奇效,對(duì)于想做老好人的進(jìn)程可以調(diào)用一次,讓操作系統(tǒng)再次進(jìn)行選舉。
審核編輯 :李倩
-
算法
+關(guān)注
關(guān)注
23文章
4627瀏覽量
93168 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6875瀏覽量
123577 -
代碼
+關(guān)注
關(guān)注
30文章
4819瀏覽量
68879
原文標(biāo)題:Thread.sleep(0)到底是個(gè)什么騷操作?
文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論