簡書 占小狼
轉(zhuǎn)載請注明原創(chuàng)出處贪绘,謝謝秧了!
前言
在日常的開發(fā)過程中厕吉,我們通過會使用Thread.sleep模擬一個耗時的任務執(zhí)行過程。
線程sleep或yield之后發(fā)生了什么琐簇?在深入細節(jié)之前蒸健,先看看線程的基本概念。
線程概念
線程是操作系統(tǒng)執(zhí)行任務的基本單位婉商,處理器的數(shù)量決定了不可能所有的線程同時得到運行似忧,這就意味著需要通過某種算法,如window下的搶占式丈秩,進行線程的調(diào)度橡娄。
一個線程從開始到結(jié)束可能會有上述幾種狀態(tài),之間可以互相轉(zhuǎn)換癣籽。
Thread.sleep
Sleep意味著線程主動告訴操作系統(tǒng)自己要休息 n 毫秒。
-
Thread.sleep(0) 進入就緒狀態(tài)
如果n=0時滤祖,意味著當前線程的時間片沒有用完筷狼,主動放棄自己剩下的時間片,進入就緒狀態(tài)匠童。這種情況下只能調(diào)度優(yōu)先級相等或更高的線程埂材,意味著優(yōu)先級低的線程很難獲得時間片,很可能永遠都調(diào)用不到汤求。當沒有符合條件的線程俏险,會一直占用 CPU 時間片,造成 CPU 100%占用率扬绪。 -
Thread.sleep(1) 進入阻塞狀態(tài)
如果n>0竖独,會強制當前線程放棄剩余時間片,并休息n秒(因為不是實時操作系統(tǒng)挤牛,時間無法保證精確莹痢,一般可能會滯后幾毫秒或一個時間片),進入阻塞狀態(tài)墓赴。這種情況下所有其它就緒狀態(tài)的線程都有機會競爭時間片竞膳,而不用在乎優(yōu)先級。無論有沒有符合的線程诫硕,都會放棄 CPU 時間坦辟,因此 CPU 占用率較低。
Thread.yield
Yield 的中文翻譯為 “讓步章办,讓位”锉走,這里意思是當前線程主動讓出時間片滨彻,并讓操作系統(tǒng)調(diào)度其它就緒態(tài)的線程使用時間片。
- 如果調(diào)用 Yield挠日,只是把當前線程放入到就緒隊列中疮绷,而不是阻塞隊列
- 如果沒有找到其它就緒態(tài)的線程,則當前線程繼續(xù)運行
- 比 Thread.Sleep(0) 速度要快嚣潜,可以讓低于當前優(yōu)先級的線程得以運行
END冬骚。
我是占小狼。
在魔都艱苦奮斗懂算,白天是上班族只冻,晚上是知識服務工作者。
讀完我的文章有收獲计技,記得關(guān)注和點贊哦喜德,如果非要打賞,我也是不會拒絕的啦垮媒!