yield與sleep


兩者都能釋放對CPU的使用權,但是在同步域中不表示釋放同步域!

 

wait會放棄對象鎖
而notify不會放棄對象鎖,需要通過推出同步代碼塊,或者調用wait以放棄對象鎖,讓被喚醒的線程執行

------------參考----------------
19.4.3  線程讓步:Thead.yield()方法

當線程在運行中執行了Thread類的yield()靜態方法,如果此時具有相同優先級的其他線程處於就緒狀態,yield()方法將把當前運行的線程放到可運行池中並使另一個線程運行。如果沒有相同優先級的可運行進程,yield()方法什么都不做。

下面對19.2.1節的例程19-4的Monkey類的fight()方法做如下修改,使小悟空線程每次打敗一個敵人后,就執行yield()方法,把運行機會讓給別的小悟空線程:

  1. public void fight(){ /* 與敵人戰斗 */  
  2.     for(int i=1;i<=100;i++){  
  3.       System.out.println(getName()+":打敗第"+i+"個敵人");  
  4.       yield();  
  5.     }  

再次運行19.2.1節的例程19-5的War程序,一種可能的打印結果如下:

  1. 第1個小悟空:打敗第1個敵人  
  2. 第2個小悟空:打敗第1個敵人  
  3. 第3個小悟空:打敗第1個敵人  
  4. 第1個小悟空:打敗第2個敵人  
  5. 第2個小悟空:打敗第2個敵人  
  6. 第3個小悟空:打敗第2個敵人  
  7. 第1個小悟空:打敗第3個敵人  
  8. 第2個小悟空:打敗第3個敵人  
  9. 第3個小悟空:打敗第3個敵人  
  10. …… 

sleep()方法和yield()方法都是Thread類的靜態方法,都會使當前處於運行狀態的線程放棄CPU,把運行機會讓給別的線程。兩者的區別在於:

sleep()方法會給其他線程運行的機會,不考慮其他線程的優先級,因此會給較低優先級線程一個運行的機會;yield()方法只會給相同優先級或者更高優先級的線程一個運行的機會。

當線程執行了sleep(long millis)方法,將轉到阻塞狀態,參數millis指定睡眠時間;當線程執行了yield()方法,將轉到就緒狀態。

sleep()方法聲明拋出InterruptedException異常,而yield()方法沒有聲明拋出任何異常。

sleep()方法比yield()方法具有更好的可移植性。不能依靠yield()方法來提高程序的並發性能。對於大多數程序員來說,yield()方法的唯一用途是在測試期間人為地提高程序的並發性能,以幫助發現一些隱藏的錯誤。本章及第20章為了使得程序能增加出現預期運行效果的可能性,在一些例子中使用了yield()方法,這只是出於演示的需要,但在實際應用中不值得效仿。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM