1. 程式人生 > >執行緒中的yield與sleep方法的區別

執行緒中的yield與sleep方法的區別

轉載出:http://www.cnblogs.com/wdfrog/archive/2013/04/24/3039475.html

wait會放棄物件鎖
而notify不會放棄物件鎖,需要通過推出同步程式碼塊,或者呼叫wait以放棄物件鎖,讓被喚醒的執行緒執行

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

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

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

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

sleep()方法宣告丟擲InterruptedException異常,而yield()方法沒有宣告丟擲任何異常。

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