1. 程式人生 > >黑馬程式設計師:yield(),sleep()以及wait()的區別

黑馬程式設計師:yield(),sleep()以及wait()的區別

---------------------- android培訓java培訓、期待與您交流! --------------------

作為一個學java的人,我覺得yield(),sleep()以及wait()是一道難以越過的坎兒,看到論壇上有很多人討論這個問題,特別是sleep()和wait()的區別,為了讓自己更清晰,記錄下來吧:

作系統會維護一個ready queue(就緒的執行緒佇列)。並且在某一時刻cpu只為ready queue中位於佇列頭部的執行緒服務。但是當前正在被服務的執行緒可能覺得cpu的服務質量不夠好,於是提前退出,這就是yield或者當前正在被服務的執行緒需要睡一會,醒來後繼續被服務,這就是

sleep

sleep方法不推薦使用,可用wait執行緒退出最好自己實現,在執行狀態中一直檢驗一個狀態,如果這個狀態為真,就一直執行,如果外界更改了這個狀態變數,那麼執行緒就停止執行。

sleep()使當前執行緒進入停滯狀態,所以執行sleep()的執行緒在指定的時間內肯定不會執行;yield()只是使當前執行緒重新回到可執行狀態,所以執行yield()的執行緒有可能在進入到可執行狀態後馬上又被執行。
sleep()
可使優先順序低的執行緒得到執行的機會,當然也可以讓同優先順序和高優先順序的執行緒有執行的機會;yield()只能使同優先順序的執行緒有執行的機會。

當呼叫wait()後,執行緒會釋放掉它所佔有的

鎖標誌,從而使執行緒所在物件中的其它synchronized資料可被別的執行緒使用。

waite()因為會對物件的鎖標誌進行操作,所以它們必須在synchronized函式或synchronizedblock中進行呼叫。如果在non-synchronized函式或non-synchronizedblock中進行呼叫,雖然能編譯通過,但在執行時會發生IllegalMonitorStateException的異常。


------------------------ android培訓java培訓、期待與您交流! ----------------------詳細請檢視:http://edu.csdn.net/heima