今天看到一段有意思的代碼: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)不光有用,而且有奇效,對于想做老好人的進程可以調用一次,讓操作系統再次進行選舉。
審核編輯 :李倩
-
算法
+關注
關注
23文章
4600瀏覽量
92649 -
操作系統
+關注
關注
37文章
6742瀏覽量
123192 -
代碼
+關注
關注
30文章
4751瀏覽量
68358
原文標題:Thread.sleep(0)到底是個什么騷操作?
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論