多執行緒核心技術(三) 執行緒間通訊

2021-10-09 20:25:09 字數 2383 閱讀 5707

等待/通知機制的實現

wait方法

方法wait的作用是使當前執行**的執行緒進行等待,wait方法是object類的方法。該方法用來將當前執行緒置入「預執行佇列」中,並且在wait所在的**處停止執行,直到接到通知或被中斷為止。在呼叫wait方法之前,執行緒必須獲得該物件的物件級別鎖。即只能在同步方法或同步**塊中呼叫wait方法。在執行wait方法後,當前執行緒釋放鎖。在從wait返回前,執行緒與其他執行緒競爭重新獲得鎖。如果呼叫wait時沒有持有適當的鎖,則丟擲illegalmonitorstateexception,它是runtimeexception的乙個子類,因此,不需要try-catch語句進行捕獲異常。

notify方法

方法notify也要在同步方法或同步塊中呼叫,即在呼叫前,執行緒也必須獲得該物件的物件級別鎖。如果呼叫notify時沒有持有適當的鎖,則丟擲illegalmonitorstateexception。該方法用來通知那些可能等待該物件的物件鎖的其他執行緒,如果有多個執行緒等待,則由執行緒規劃器隨機挑選出其中乙個呈wait狀態的執行緒,對其發出通知notify,並使它等待獲取該物件的物件鎖。需要說明的是,在執行notify方法後,當前執行緒不會馬上釋放該物件鎖,呈wait狀態的執行緒也並不能馬上獲取該物件鎖,要等到執行notify方法的執行緒將程式執行完,也就是退出synchronized**塊之後,當前執行緒才會釋放鎖,而呈wait狀態所在的執行緒才可以獲取該物件鎖。

**展示:

class

threada

extends

thread

@override

public

void

run()}

catch

(interruptedexception e)}}

class

threadb

extends

thread

@override

public

void

run()}

}public

class

mythread

}

begin: wait time:

1601214757037

begin: notify time:

1601214757037

end: notify time:

1601214757037

end: wait time:

1601214757037

等待喚醒機制涉及的方法總結:

1.wait();讓執行緒處於阻塞狀態,這時執行緒會釋放執行資格和執行權,被wait的執行緒會被儲存到執行緒池中2.notify();喚醒執行緒池中的乙個執行緒(任意)

3.notifyall();喚醒執行緒池中的所有執行緒這些方法都必須定義在同步中

因為這些方法是用於操作執行緒狀態的方法,必須要明確到底操作的是哪個鎖上的執行緒。例如在a鎖裡wait必須在該鎖裡notify。由於鎖可以是任意物件,故這些方法定義在object類中。等待和喚醒必須是同乙個鎖。

生產者/消費者模式實現

1.一生產者一消費者

使用生產烤鴨和消費烤鴨的例子來模擬單生產者單消費者。設定標誌來判斷此時是需要生產還是消費,當標誌false,說明資源為空,此時生產烤鴨,將標誌置為true並且通知消費執行緒來消費資源,如果cpu的執行權還是切換到了生產者執行緒,此時標記為true,生產者執行緒就會進入阻塞狀態,釋放cpu的執行權和監視器(鎖);如果消費執行緒獲得cpu的執行權就會拿到相同的鎖,判斷標記為true就會消費資源,將標記置為false,並且通知生產線程生產,再次拿到cpu的執行權的話就會進入等待狀態。

同步及等待喚醒機制使生產消費正確進行,得到生產乙隻烤鴨就消費乙隻烤鴨的結果。

2.多生產者多消費者

解決多個執行緒都進入等待問題的思路就是喚醒對方的執行緒(就是生產者執行緒喚醒消費者執行緒,而不是喚醒生產者執行緒),而不是喚醒本方執行緒,由於沒有這種方法就全部喚醒,已方執行緒醒了話會判斷標記,不會出現多生產或者多消費的問題。

join方法

1、join使用場景及說明

在很多情況下,主線程建立並啟動子執行緒,如果子執行緒中要進行大量的耗時運算,主線程往往將早於子執行緒結束之前結束。這時,如果主線程想等待子執行緒執行完之後再結束,比如子執行緒處理乙個資料,主線程要取得這個資料的值,就要用到join方法。join方法的作用是等待執行緒物件銷毀。

2、join(long)與sleep(long)的區別

join(long)的內部是使用wait(long)實現的,兩者的區別實際上就是wait(long)和sleep(long)的區別,前者釋放鎖,而後者不釋放鎖。

類threadlocal的使用

類threadlocal主要解決的就是每個執行緒繫結自己的值,使每個執行緒都有自己的變數,並且該變數對於其他執行緒而言是隔離的。threadlocal的應用以及原理可以參考部落格threadlocal就是這麼簡單。

C 多執行緒程式設計 三 執行緒間通訊

七 執行緒間通訊 一般而言,應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣,主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說明。使用全域性變數進行通訊 由於屬於...

三 執行緒間通訊

1 wait方法 notify方法和notifyall方法 舉個例子說明 public class mythread1 extends thread override public void run catch interruptedexception e public class mythread...

多執行緒核心技術 多執行緒技能

1 建立執行緒的方法 繼承thread,實現runnable 注意 例項變數與執行緒安全 2 具體方法 isalive 判斷執行緒狀態,進入準備生命週期的執行緒返回true sleep 睡眠,需要跑出interrupt異常以便執行緒打斷丟擲 如果在sleep的執行緒被打斷,sleep會被設定為fal...