Thread.sleep(0)到底是個什麼騷操作?

今天看到一段有意思的代碼:Thread.sleep(0),下面就來分析一下這串看似無用的代碼到底有沒有用。

Thread.sleep(0)到底是個什麼騷操作,這睡0毫秒和不睡有什麼區別嗎?

操作系統資源的分配策略

想要去了解多線程,就先要去了解操作系統中資源的不同分配策略
在操作系統中,CPU資源的分配策略有多種,下面就拿兩種最爲典型的策略舉例:

時間片算法

基於時間片算法分配資源的代表就是Unix系統。在時間片算法中,操作系統會維護一個隊列,將所有的進程放入隊列中。然後操作系統會按照隊列中的進程順序爲他們分配屬於自己的運行時間,也就是說,操作系統給A進程分配n毫秒時間,那麼A進程在本次排隊時只可以運行n毫秒。當A進程運行完n毫秒後,操作系統不管A是否運行完畢都會把運行權限強行剝奪,交給隊列裏面的下一個進程去執行,然後A進程繼續去隊列尾部進行下一次排隊。(這裏,如果A在n毫秒之前提前結束或者被阻塞,操作系統會立即收回A的運行權限)

舉個例子:

你去食堂買飯,這種模式就是食堂會強制你去排隊,而且沒人只有十分鐘點餐時間,一旦過了這個時間你就要重新去排隊。

搶佔式

基於搶佔式分配資源的代表是Winodws系統。搶佔式的操作系統都是“儒家學派”的,默認每個進程都是“君子”。意思就是:一個進程一旦拿到CPU後,除非它主動放棄CPU權限,不然別的進程是拿不到CPU權限的。然後操作系統在選取執行權限的時候也不是隨機選的,它會根據優先級和飢餓時間來判定誰更需要CPU權限的。每次一個進程是釋放CPU後,就會進行一次優先級評定。也就是說,如果運氣好,每次都會被選中。

舉個例子:

你去食堂買飯,食堂阿姨看你小夥子挺帥就先給你盛飯。然後給你盛完飯再選一次,又發現你這小夥子越看越順眼,就再給你一碗。

關於Sleep

拿搶佔式來說。去食堂喫飯,阿姨看小夥子挺不錯,三番五次的給你盛飯,但是你已經喫飽了,這時候你就會告訴阿姨我喫飽了,接下來半小時不要再給我盛飯了。對應到代碼裏就是,A最近30min不想再參與資源選舉了,這時它就會sleep(30 * 60 * 1000),然後操作系統就會進行再次選舉,並且未來半小時A不參與選舉。此時當A醒來之後,或許CPU執行權在另一個進程手裏。

再說Thread.sleep(0)

假如A執行了一段時間後,突然想起來其他小夥伴可能也需要CPU執行權限,不能光自己一個人霸佔這個CPU,但是又沒辦法主動申請再次選舉,就只能退而求其次執行Thread.sleep(0),在A有執行權限的情況下執行,執行後告訴操作系統,我要休息0毫秒,你接下來0毫秒內的選舉就不要選我啦。但是操作系統下次再選舉的時候還是會把A算進去,因爲0毫秒已經過了。

總結

Thread.sleep(0)不光有用,而且有奇效,對於想做老好人的進程可以調用一次,讓操作系統再次進行選舉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章