1. 程式人生 > >《多執行緒程式設計》學習之七:等待/通知機制(一)

《多執行緒程式設計》學習之七:等待/通知機制(一)

         今天起開始學習執行緒之間的通訊。等待/通知機制是通過Object類的wait()與notify()方法來實現的,這兩個方法在同步方法或同步程式碼塊中才能被執行。wait()方法將當前執行緒放入“等待執行佇列”中,使執行緒在wait()方法所處程式碼處停止執行,直到被喚醒或者被中斷為止,執行wait()方法會釋放物件鎖。notify()方法用於通知等待物件鎖的其它執行緒,但執行notify()方法並不會立即釋放物件鎖,要等notify()所在的執行緒執行完後,才會釋放。

1、wait()方法是Object類的方法,要在同步方法/塊中執行。


2、只調用wait()方法,則執行緒會一直等待下去


3、使用notify()喚醒其他執行緒,但不會立即釋放物件鎖,而wait()方法會立即釋放。




          你想啊,如果wait()方法不釋放鎖,怎麼被notify()呢?本例中,threadB中呼叫notify()方法後,在sleep(2000),以證明notify()方法並不會立即釋放物件鎖。

4、notify()方法隨機喚醒等待佇列中等待共享資源的“一個”執行緒,notifyAll()方法則喚醒全部。




可見notify()方法只喚醒一個執行緒,當呼叫notify()方法的次數小於執行緒物件數時,有的執行緒物件就無法被喚醒了。為喚醒所有的執行緒,可以使用notifyAll()方法:


5、wait(long)方法:在指定時間內等待被喚醒,超過這個時間則自動喚醒。



6、呼叫wait()的條件發生變化




        這裡出現異常的原因是程式開始時有兩個執行緒執行了list.size() == 0,都處於wait()狀態,當程式Thread.sleep(2000)後,往list裡添加了一個元素並喚醒上面兩個執行緒,第一個執行緒成功刪除一個元素,第二個執行緒嘗試刪除list的元素,但此時list已經為空了,所以拋異常了。一般地,執行wait()的條件用while而不用if,也就是說,只要滿足條件了,都要等待。