小議 Thread.sleep(0) 造成 CPU佔用率高的問題

lqg1122發表於2012-08-28

首先,我們要清楚相關概念:

1.CPU使用率其實就是你執行的程式佔用的CPU資源,表示你的機器在某個時間點的執行程式的情況。使用率越

高,說明你的機器在這個時間上執行了很多程式,反之較少。使用率的高低與你的CPU強弱有直接關係。現代分時

多工作業系統對 CPU 都是分時間片使用的:比如A程式佔用10ms,然後B程式佔用30ms,然後空閒60ms,再又

是A程式佔10ms,B程式佔30ms,空閒60ms;如果在一段時間內都是如此,那麼這段時間內的佔用率為40%。CPU

對執行緒的響應並不是連續的,通常會在一段時間後自動中斷執行緒。未響應的執行緒增加,就會不斷加大CPU的佔用。

《來自百度百科》

2.Thread.sleep(0)的作用不是單單的說執行緒睡了0ms,它會硬性觸發CPU的一個動作-------計算所有等待執行緒的優先

級,以確定下一個CPU控制權的獲得者。


好,這小動作理論上對於搶佔式執行緒來說是有良好的影響的:

1.避免了某一執行緒長時間霸佔CPU資源

2.避免了執行緒假死

3.讓執行緒可以有比較平均的機會獲得CPU資源


但是最近發現一個問題,當在一個多執行緒執行的平臺的執行緒裡面加入sleep(0)之後出現了兩種情況:

1.執行緒空跑的時候CPU佔用率很高,甚至滿了,但執行緒沒死,平臺沒死;

2.所有執行緒都在跑任務的時候,CPU佔用率不高,很正常。那為什麼會出現這樣的情況?


我是這樣理解的:

1.執行緒空跑:由於每條執行緒都加了sleep(0),所以執行緒的唯一動作就是觸發cpu去計算優先順序,不斷的計算,這樣cpu

基本是沒有空閒的時間,導致了cpu佔用率居高不下。

2.執行緒跑任務:執行緒開始到執行緒結束是有一段時間間隔的,而且根據不同的環境情況間隔會有長有短,就是說線上程

執行的時間裡面,不會觸發cpu計算優先順序,這樣計算的次數減少, 間隔增大,而且,在大量執行緒再跑的時候,等待

的執行緒少了甚至都在執行了,這樣cpu空閒的時間就出來了,所以cpu 的佔用率就不高了。


所以,Thread.sleep(0) 是個好東西,但要用在合適的地方才能很好的發揮它的作用。

首先可以確定的是Thread.sleep(0)是比較的耗資源的,所以不可以濫用,上面的例子屬於濫用了,把sleep(0)放到了

每條執行緒,然後沒必要頻繁的計算等待執行緒的優先順序,不僅僅會出現兩極分化情況,還很耗資源。


我的想法是這樣的;

建立一條工作執行緒之外的執行緒,由它定時來負責這個事兒,這樣把消耗減到最少,而且有保證了工作執行緒的健康存

活,這樣在空閒或繁忙的情況下CPU佔用率會比較穩定。


(個人想法,如有不同想法,希望交流 )



相關文章