Java多執行緒中的wait notify

2021-08-14 21:07:05 字數 1174 閱讀 8747

關於物件鎖:物件鎖 -

wait 方法在使用之前,必須先獲得此物件的物件鎖,所以必須在同步方法或者同步塊中使用,執行 wait 方法後,當前執行緒釋放該物件的鎖。wait 返回之前,此執行緒需要和其他等待物件的執行緒競爭來獲得鎖,才能繼續執行 wait 後的處理。

notify 方法也必須在同步方法或者同步塊中呼叫,這個方法用來通知其他等待當前物件的執行緒,如果有多個執行緒在等待,就由jvm隨機挑選乙個在 wait 狀態的執行緒,對其傳送 notify,將物件的物件鎖交給該執行緒。當執行完 notify 方法後,不會立即交出物件鎖,要等當前執行緒執行完同步的**塊後,才會將物件鎖交出。另外,當某個處於 wait 狀態的執行緒執行完之後,如果沒有再次呼叫 notify 方法,其他所有處於 wait 狀態等待物件鎖的執行緒將不會收到通知,從而就不會被執行。

下面乙個多執行緒程式設計核心技術書中的例子:

public

class

threada

extends

thread

@override

public

void

run()

}catch(interruptedexception e)

}}public

class

threadb

extends

thread

@override

public

void

run()

}}public

class

test catch (interruptedexception e)

}}

執行結果為:

開始 wait: 1516585999636

開始 notify: 1516586002635

結束 notify: 1516586002636

結束 wait: 1516586002636

可以看到 wait 在 notify 的同步塊完全執行完後,開始被喚醒執行的。

另外,notify 和 notifyall 不同,notify 方法只通知乙個等待佇列中的執行緒,使其變為可執行,其他執行緒仍在等待佇列中等待通知訊號;而 notifyall 可以讓所有處於等待同一資源的執行緒從等待狀態變為可執行狀態。此時,優先順序高的執行緒先執行,也有可能是隨機由jvm來隨機執行。

java中的多執行緒

package testthread 店員從生產者取貨,消費者從店員取貨,店員最多只能存放20個產品,當產品不夠20個需通知生產者生產,超過20個時停止消費 author passenger 店員類 class clerk catch interruptedexception e else 消費產品...

java中的多執行緒

建立執行緒的第一種方法 繼承thread類。步驟 1,定義乙個類繼承thread 2,複寫thread類中的run方法 目的 將自定義 儲存在run方法中,讓執行緒執行 3,呼叫執行緒的start方法,該方法用兩個作用 啟動執行緒,呼叫run方法 多執行緒的特性 隨機性 示例 class demo ...

java 中 的多執行緒

package wait 執行緒同步涉及的 同步控制 wait 使當前執行緒等待,不在爭搶cpu,並釋放同步 塊 或 同步方法的 鎖 notify 喚醒 某乙個 被 wait 的執行緒 notifyall 喚醒所有 被 wait 的執行緒 public class testwait implemen...