關於物件鎖:物件鎖 -
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...