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

2021-07-24 03:14:11 字數 1618 閱讀 1434

今天起開始學習執行緒之間的通訊。等待/通知機制是通過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,也就是說,只要滿足條件了,都要等待。

3 1等待 通知機制(wait notify)

要點 wait 執行前在呼叫wait 之前,必須先要獲得物件鎖,即只有在同步方法或者同步 塊中呼叫wait 方法。執行作用 wait 使程序進入等待 阻塞狀態 在收到通知或者被中斷之前都會進入預執行佇列。執行之後1 執行wait 之後,當前執行緒釋放改物件鎖,在通知前與其他執行緒重新競爭資源 執行之...

11 等待 通知(wait notify)機制介紹

1.當兩個執行緒主動地讀取乙個共享變數時,在花費讀取時間的基礎上,讀取到的值是不是想要的,並不能完全確定,等待 通知 機制就用來滿足這樣的需求。2.wait 的作用是使當前執行的執行緒進行等待。呼叫之前要獲取物件級別鎖,即只能在同步方法中或者同步塊中呼叫。執行wait 方法後,當前執行緒釋放鎖,在從...

03 Java多執行緒 執行緒等待通知機制

三 執行緒等待通知 四 參考 如果等待時長為t,當前時間為now,那麼now t以後超時 long overtime now t long remain t while result不滿足 remian 0 return result shop類模擬商店,初始狀態玩具是nothing,執行緒等待玩具...