執行緒系列三 執行緒的等待與喚醒機制

2022-01-31 02:07:28 字數 1545 閱讀 7205

為了更高效的處理一些時間片短,任務量大的任務,我們可能會經常用到多執行緒。但是多執行緒的環境下,很容易出現執行緒併發問題,執行緒死鎖就是很常見的一種併發問題。為了避免此類問題,我們會用到執行緒間的通訊,而等待喚醒機制,就是執行緒間通訊的一種形式。

等待喚醒機制用到的方法主要有:

public final void wait() throws interruptedexception :
當前執行緒必須擁有此物件監視器。該執行緒發布對此監視器的所有權並等待,直到其他執行緒通過呼叫 notify 方法,或 notifyall 方法通知在此物件的監視器上等待的執行緒醒來。然後該執行緒將等到重新獲得對監視器的所有權後才能繼續執行。
wait()還有另外兩個過載的方法 :
wait(long timeout)、 wait(long timeout,int nanos)
public final void notify()
喚醒在此物件監視器上等待的單個執行緒。如果所有執行緒都在此物件上等待,則會選擇喚醒其中乙個執行緒。選擇是任意性的,並在對實現做出決定時發生。執行緒通過呼叫其中乙個wait方法,在物件的監視器上等待。直到當前執行緒放棄此物件上的鎖定,才能繼續執行被喚醒的執行緒。被喚醒的執行緒將以常規方式與在該物件上主動同步的其他所有執行緒進行競爭;
1、通過執行此物件的同步例項方法。
2、通過執行在此物件上進行同步的synchronized語句的正文。
3、對於class型別的物件,可以通過執行該類的同步靜態方法。一次只能有乙個執行緒擁有物件的監視器。
public final void notifyall():
喚醒在此物件監視器上等待的所有執行緒。執行緒通過呼叫其中乙個wait方法,在物件的監視器上等待。直到當前執行緒放棄此物件上的鎖定,才能繼續執行被喚醒的執行緒。被喚醒的執行緒將以常規方式與在該物件上主動同步的其他所有執行緒進行競爭;
例如,喚醒的執行緒在作為鎖定此物件的下乙個執行緒方面沒有可靠的特權或劣勢。此方法只應由作為此物件監視器的所有者的執行緒來呼叫。
需要注意:
1、執行緒用到的鎖物件可以是任意物件,這點從wait方法和notify方法可以看出來,因為它們是object類的方法,而object類是所有類的父類。
2、上文中所提到的「監視器」即指「鎖物件」。
3、wait方法被呼叫時,執行緒進入阻塞狀態,會釋放所占用的資源,釋放cpu執行權,丟擲interruptedexception,這幾點與sleep方法是相同的。但是與之不同的地方時,wati方法還會釋放鎖,而sleep方法不會。
執行緒的五態轉換圖:

wait()會立刻釋放sycronized(obj)中的obj鎖,以便其他執行緒可以執行obj.nodify()

但是nodify()不會立刻立刻釋放sycronized(obj)中的obj鎖,

執行緒等待喚醒機制

等待喚醒機制 乙個執行緒在工作時發現某些條件不滿足了,這時可以釋放掉鎖,並暫停工作。目的是讓另乙個執行緒插入進來,進行條件的補給 後進入的執行緒在補足條件後,可以進行 喚醒 將之前所有等待的執行緒喚醒,讓他們繼續工作,然後自己退出。喚醒之後執行的 system.out.println 包子已經做好了...

執行緒的等待喚醒機制

執行緒間通訊 多個執行緒併發執行時,在預設情況下cpu是隨機切換執行緒的,當我們需要多個執行緒來共同完成一件任務,並且我們希望他們有規律的執行,那麼多執行緒之間需要一些協調通訊,以此來幫我們達到多執行緒共同操作乙份資料。如何保證執行緒間通訊有效利用資源 多個執行緒在處理同乙個資源,並且任務不同時,需...

執行緒等待與喚醒

標籤 多執行緒 所有的等待和喚醒執行緒,都是針對某個具體物件例項的.api介面 說明wait 讓當前執行緒進入等待 阻塞 狀態,直到其他執行緒呼叫此物件的notify 或notifyall 來喚醒,之後該執行緒進入就緒狀態.wait long timeout 讓當前執行緒進入阻塞狀態,直到其他執行緒...