1. 程式人生 > >sleep()方法和wait()方法的區別? sleep()方法和yield()方法的區別?

sleep()方法和wait()方法的區別? sleep()方法和yield()方法的區別?

區別 illegal 等待 cat 運行 使用 zed 對象 err

sleep()方法和wait()方法的區別?

  1. sleep方法是Thread的靜態方法,wait方法是Object類的普通方法
  2. sleep方法不釋放同步鎖,wait方法釋放同步鎖(執行notify方法喚醒wait的線程時是不釋放同步鎖的)
  3. wait方法用於線程間通信,而sleep方法用於短暫的暫停線程
  4. sleep針對當前線程,而wait針對被同步代碼塊加鎖的對象
  5. sleep方法是當前線程暫停指定時間,將執行機會讓給其它線程,時間結束後進入就緒狀態等待
  6. 調用wait方法會暫停線程,當前線程釋放對象的同步鎖,進入等待池(wait pool),只有調用對象的notify或者notifyAll方法喚醒時,線程進入等鎖池(lock pool),直到線程再次獲得對象的鎖才會進入就緒狀態
  7. wait方法(notify,notifyAll)只能在同步方法或者同步塊中使用(如果在non-synchronized函數或non-synchronizedblock中進行調用,雖然能編譯通過,但在運行時會發生illegalMonitorStateException的異常);sleep方法可以在任意位置使用

註:

  如果線程A希望立即結束線程B,則可以對線程B對應的Thread實例調用interrupt方法。如果此刻線程B正在wait/sleep/join,則線程B會立刻拋出InterruptedException,在catch() {} 中直接return即可安全地結束線程

sleep()方法和yield()方法的區別?

  1. sleep方法給其他線程機會時不考慮線程優先級(優先級低的也有可能);而yield方法只會給相同優先級或者更高優先級線程機會(如果沒有相同或者更高優先級的線程,該線程會繼續運行)
  2. 線程執行sleep方法進入阻塞狀態,執行yield方法進入就緒狀態

sleep()方法和wait()方法的區別? sleep()方法和yield()方法的區別?