1. 程式人生 > >wait和notify方法詳解

wait和notify方法詳解

wait和notify方法

wait方法和notify方法是Object類的方法,用以支援執行緒間通訊。
1、wait方法
以下是wait方法的三個過載方法:

public final void wait() throws InterruptedExeception
public final void wait(long timeout) throws InterruptedExeception
public final void wait(long timeout,int nanos) throws InterruptedExeception
  • wait方法的三個過載方法都將呼叫wait(long timeout)方法,wait()等價於wait(0),代表永不超時。
  • Object的wait(long timeout)方法會導致當前執行緒進入阻塞,知道其他執行緒呼叫了該Object的notify()或notifyAll()方法才能將其喚醒,或者阻塞到達了timeout時間而自動喚醒。
  • wait方法必須擁有該物件的monitor,也就是wait方法必須在同步方法中使用。
  • 當前執行緒執行了物件的wait方法之後,將會放棄對該monitor的所有權比進入該物件關聯的wait set中,也就是說wait方法會釋放鎖。

2、notify方法

public final native void notify();
  • notify方法喚醒單個只在執行該物件wait方法的執行緒,notifyAll方法喚醒全部。
  • 如果某個執行緒由於執行該物件的wait方法而進入阻塞則會被喚醒,如果沒有則會被忽略。
  • 被喚醒的執行緒需要重新獲得該物件關聯的monitor的鎖才能繼續執行。

3、使用wait和notify方法的注意事項

  • wait方法是可中斷方法。當前執行緒呼叫wait方法進入阻塞狀態,其他執行緒可以使用interrupt方法將其打斷。可中斷方法被打斷後會收到中斷異常InterruptedException,同時interrupt標識會被擦除。
  • 執行緒執行了某個物件的wait方法後,會加入與之對應的wait set中,每一個物件的monitor都有一個與之關聯的wait set。
  • 必須在同步方法中使用wait和notify方法,因為執行wait和notify方法的前提條件是必須持有同步方法的monitor的所有權。
  • 同步程式碼鎖的物件必須與執行wait和notify方法的物件一致。

4、wait和sleep的異同

  • wait和sleep方法都可以使執行緒進入阻塞狀態
  • wait和sleep方法都是可中斷方法,被中斷後都會收到中斷異常
  • wait是Object的方法,sleep是Thread的方法
  • wait方法必須在同步程式碼中執行,而sleep不需要
  • 在同步程式碼中執行sleep方法時,不會釋放鎖,而wait方法會釋放鎖
  • sleep方法休眠後會主動退出阻塞,而wait方法(未指定等待時間)則需要被其他執行緒中斷或喚醒才能退出阻塞