等待/通知機制,是指一個線程A調(diào)用了對象的O的wait()方法進入等待狀態(tài),而另一個線程B調(diào)用了對象O的notify()或notifyAll()方法,線程A收到通知后從對象O的wait()方法返回,進而執(zhí)行后續(xù)動作。因此,等待通知機制需要與同步代碼塊或同步方法混合使用。
相關(guān)方法
| 方法名稱 | 描述 |
|---|---|
| notify() | 通知一個在對象上等待的線程,使其從wait()方法返回,而返回的前提是該線程獲取到了對象的鎖 |
| notifyAll() | 通知所有等待在該對象上的線程 |
| wait | 調(diào)用該方法的線程進入WAITING狀態(tài),只有等待另外線程的通知或被中斷才會返回,需要注意的是調(diào)用wait()方法后,會釋放對象的鎖 |
| wait(long) | 等待超時返回(單位毫秒) |
注意細節(jié)
1.使用wait(),notify(),notifyAll()時需要先對調(diào)用對象加鎖。
2.調(diào)用wait()方法后,線程狀態(tài)有RUNNING變?yōu)閃AITING,并將當前線程放置到對象的等待隊列。
3.notify()或notifyAll()方法調(diào)用后,等待線程需要在調(diào)用notify()或notifyAll()的線程釋放鎖后,才有機會從wait()返回。
4.notify()方法將等待隊列中的一個等待線程從等待隊列中移到同步隊列中,被移動的線程狀態(tài)由WAITING轉(zhuǎn)為BLOCKED。
5.從wait方法返回的前提是獲得調(diào)用對象的鎖。
WaitNotify示意圖

引自[并發(fā)編程的藝術(shù)]