Java併發程式設計學習 3 執行緒間協作

2021-09-12 07:21:48 字數 2372 閱讀 6054

目錄頁:

t.join()方法阻塞呼叫此方法的執行緒(calling thread),直到執行緒t完成,此執行緒再繼續;直接上**。

package com.concurrent.coline.part3.join;

/** * 類說明:join方法的使用

*/public class usejoin

@override

public void run() catch (interruptedexception e)

system.out.println(thread.currentthread().getname() + " terminted.");}}

public static void main(string args) throws exception

thread.sleep(2000);

system.out.println(thread.currentthread().getname() + " terminate.");}}

**位置:sharing-collaboration的part3

執行結果:

這裡我們看下join的原始碼

可以看到join方法底層是使用wait方法實現的,而且其實join方法是可以傳入乙個long的引數,作為wait的時間,大家可以稍微看下。1、

wait()

、notify/notifyall()

方法是object

的本地final

方法,無法被重寫。 2

、wait()

使當前執行緒阻塞,前提是

必須先獲得鎖,一般配合

synchronized

關鍵字使用,即,一般在

synchronized

同步**塊裡使用

wait()

、notify/notifyall()

方法。 3、

由於wait()

、notify/notifyall()

在synchronized

**塊執行,說明當前執行緒一定是獲取了鎖的。

當執行緒執行

wait()

方法時候,會釋放當前的鎖,然後讓出

cpu,進入等待狀態。

只有當notify/notifyall()

被執行時候,才會喚醒乙個或多個正處於等待狀態的執行緒,然後繼續往下執行,直到執行完

synchronized

**塊的**或是中途遇到

wait()

,再次釋放鎖。

也就是說,

notify/notifyall()

的執行只是喚醒沉睡的執行緒,而不會立即釋放鎖,鎖的釋放要看**塊的具體執**況。所以在程式設計中,盡量在使用了

notify/notifyall()

後立即退出臨界區,以喚醒其他執行緒 4

、wait()

需要被try catch

包圍,中斷也可以使

wait

等待的執行緒喚醒。 5

、notify

和wait

的順序不能錯,如果

a執行緒先執行

notify

方法,b

執行緒在執行

wait

方法,那麼

b執行緒是無法被喚醒的。 6

、notify

和notifyall

的區別

notify

方法只喚醒乙個等待(物件的)執行緒並使該執行緒開始執行。所以如果有多個執行緒等待乙個物件,這個方法只會喚醒其中乙個執行緒,選擇哪個執行緒取決於作業系統對多執行緒管理的實現。

notifyall

會喚醒所有等待

(物件的

)執行緒,儘管哪乙個執行緒將會第乙個處理取決於作業系統的實現。如果當前情況下有多個執行緒需要被喚醒,推薦使用

notifyall

方法。比如在生產者

-消費者裡面的使用,每次都需要喚醒所有的消費者或是生產者,以判斷程式是否可以繼續往下執行。

使當前執行緒從執行狀態(執行狀態)變為可執行態(就緒狀態)。

cpu會從眾多的可執行態裡選擇,也就是說,當前也就是剛剛的那個執行緒還是有可能會被再次執行到的,並不是說一定會執行其他執行緒而該執行緒在下一次中不會執行到了。

yield

方法執行時不會釋放持有的鎖。

併發程式設計 3 執行緒間共享資料

一 共享記憶體帶來的問題 讀時沒問題,寫時會有競爭問題。二 解決方法 1 最簡單的辦法就是對資料結構採用某種保護機制,確保只有進行修改的執行緒才能看到不變數被破壞時的中間狀態。從其他訪問執行緒的角度來看,修改不是已經完成了,就是還沒開始。2 另乙個選擇是對資料結構和不變數的設計進行修改,修改完的結構...

java併發程式設計學習(3)

銀行排隊叫號的場景如圖所示 有乙個出票機,按順序出票。有多個櫃檯叫號。對於這樣的場景,實現可以分為2部分,出票機和櫃檯。出票機public class ticketwindow implements runnable catch interruptedexception e 新建ticketwind...

併發程式設計 程序,執行緒,協程,非同步

併發程式設計 不是並行 目前有四種方式 多程序 多執行緒 協程和非同步。程序執行緒 協程總結 協程,又稱微執行緒,纖程。python的執行緒並不是標準執行緒,是系統級程序,執行緒間上下文切換有開銷,而且python在執行多執行緒時預設加了乙個全域性直譯器鎖 gil 因此python的多執行緒其實是序...