簡(jiǎn)書(shū) 占小狼
轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝!
前言
在日常的開(kāi)發(fā)過(guò)程中,我們通過(guò)會(huì)使用Thread.sleep模擬一個(gè)耗時(shí)的任務(wù)執(zhí)行過(guò)程。
線(xiàn)程sleep或yield之后發(fā)生了什么?在深入細(xì)節(jié)之前,先看看線(xiàn)程的基本概念。
線(xiàn)程概念
線(xiàn)程是操作系統(tǒng)執(zhí)行任務(wù)的基本單位,處理器的數(shù)量決定了不可能所有的線(xiàn)程同時(shí)得到運(yùn)行,這就意味著需要通過(guò)某種算法,如window下的搶占式,進(jìn)行線(xiàn)程的調(diào)度。

Paste_Image.png
一個(gè)線(xiàn)程從開(kāi)始到結(jié)束可能會(huì)有上述幾種狀態(tài),之間可以互相轉(zhuǎn)換。
Thread.sleep
Sleep意味著線(xiàn)程主動(dòng)告訴操作系統(tǒng)自己要休息 n 毫秒。
-
Thread.sleep(0) 進(jìn)入就緒狀態(tài)
如果n=0時(shí),意味著當(dāng)前線(xiàn)程的時(shí)間片沒(méi)有用完,主動(dòng)放棄自己剩下的時(shí)間片,進(jìn)入就緒狀態(tài)。這種情況下只能調(diào)度優(yōu)先級(jí)相等或更高的線(xiàn)程,意味著優(yōu)先級(jí)低的線(xiàn)程很難獲得時(shí)間片,很可能永遠(yuǎn)都調(diào)用不到。當(dāng)沒(méi)有符合條件的線(xiàn)程,會(huì)一直占用 CPU 時(shí)間片,造成 CPU 100%占用率。 -
Thread.sleep(1) 進(jìn)入阻塞狀態(tài)
如果n>0,會(huì)強(qiáng)制當(dāng)前線(xiàn)程放棄剩余時(shí)間片,并休息n秒(因?yàn)椴皇菍?shí)時(shí)操作系統(tǒng),時(shí)間無(wú)法保證精確,一般可能會(huì)滯后幾毫秒或一個(gè)時(shí)間片),進(jìn)入阻塞狀態(tài)。這種情況下所有其它就緒狀態(tài)的線(xiàn)程都有機(jī)會(huì)競(jìng)爭(zhēng)時(shí)間片,而不用在乎優(yōu)先級(jí)。無(wú)論有沒(méi)有符合的線(xiàn)程,都會(huì)放棄 CPU 時(shí)間,因此 CPU 占用率較低。
Thread.yield
Yield 的中文翻譯為 “讓步,讓位”,這里意思是當(dāng)前線(xiàn)程主動(dòng)讓出時(shí)間片,并讓操作系統(tǒng)調(diào)度其它就緒態(tài)的線(xiàn)程使用時(shí)間片。
- 如果調(diào)用 Yield,只是把當(dāng)前線(xiàn)程放入到就緒隊(duì)列中,而不是阻塞隊(duì)列
- 如果沒(méi)有找到其它就緒態(tài)的線(xiàn)程,則當(dāng)前線(xiàn)程繼續(xù)運(yùn)行
- 比 Thread.Sleep(0) 速度要快,可以讓低于當(dāng)前優(yōu)先級(jí)的線(xiàn)程得以運(yùn)行
END。
我是占小狼。
在魔都艱苦奮斗,白天是上班族,晚上是知識(shí)服務(wù)工作者。
讀完我的文章有收獲,記得關(guān)注和點(diǎn)贊哦,如果非要打賞,我也是不會(huì)拒絕的啦!