wait和notify方法詳解
阿新 • • 發佈:2018-11-28
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方法(未指定等待時間)則需要被其他執行緒中斷或喚醒才能退出阻塞