Java多執行緒 52 三個和三個以上執行緒之間的通訊

2021-09-07 10:02:09 字數 3372 閱讀 1864

前面一篇介紹了兩個執行緒之間的通訊,那麼三個執行緒和三個以上執行緒之間的通訊是如何實現呢。我們前面一篇在查詢object類的時候,知道有乙個wait()和notify()方法,同時還有乙個notifyall()方法。這個notfiyall()方法就是來解決三個以上執行緒通訊的。

1.基於前面知識,新增乙個執行緒,看看執行效果

package thread;

public class notifyall_demo catch (interruptedexception e) }}

}.start();

new thread() catch (interruptedexception e) }}

}.start();

new thread() catch (interruptedexception e) }}

}.start(); }}

class printer2

system.out.print("跟");

system.out.print("我");

system.out.print("一");

system.out.print("起");

system.out.println("念");

flag = 2;

this.notify(); // 設定flag等於2,使用執行緒喚醒功能,其他執行緒就可以啟動

} }public void print2() throws interruptedexception

system.out.print("做");

system.out.print("測");

system.out.print("試");

system.out.print("死");

system.out.print("路");

system.out.print("一");

system.out.println("條");

flag = 3;

this.notify(); //隨機喚醒單個等待的執行緒

} }public void print3() throws interruptedexception

system.out.print("信");

system.out.print("才");

system.out.print("怪");

system.out.println("呢");

flag = 1;

this.notify(); //隨機喚醒單個等待的執行緒

} }}

執行效果:

做測試死路一條

跟我一起念

信才怪呢

做測試死路一條

跟我一起念

信才怪呢

做測試死路一條

跟我一起念

信才怪呢

做測試死路一條

跟我一起念

信才怪呢

做測試死路一條

跟我一起念

發現列印順序有問題,主要有兩個原因,if語句有乙個特點,**在**停止(上面wait)就在**起來。第二個特點就是notify()是隨機喚醒等待執行緒。這個隨機特點就造成了列印結果順序不可控。

2.if語句換成while語句,notify()方法換成notifyall()方法

if沒有每次都對flag進行判斷,但是while語句會每次都進行條件判斷。notifyall()就是把全部的執行緒都喚醒,然後這些執行緒去判斷,再執行相關列印。

package thread;

public class notifyall_demo catch (interruptedexception e) }}

}.start();

new thread() catch (interruptedexception e) }}

}.start();

new thread() catch (interruptedexception e) }}

}.start(); }}

class printer2

system.out.print("跟");

system.out.print("我");

system.out.print("一");

system.out.print("起");

system.out.println("念");

flag = 2;

this.notifyall();

} }public void print2() throws interruptedexception

system.out.print("做");

system.out.print("測");

system.out.print("試");

system.out.print("死");

system.out.print("路");

system.out.print("一");

system.out.println("條");

flag = 3;

this.notifyall();

} }public void print3() throws interruptedexception

system.out.print("信");

system.out.print("才");

system.out.print("怪");

system.out.println("呢");

flag = 1;

this.notifyall();

} }}

執行效果:

跟我一起念

做測試死路一條

信才怪呢

跟我一起念

做測試死路一條

信才怪呢

跟我一起念

做測試死路一條

信才怪呢

跟我一起念

做測試死路一條

信才怪呢

跟我一起念

做測試死路一條

信才怪呢

...

多執行緒之間需要注意的問題

1.在同步**塊中,用哪個物件鎖,就用哪個物件呼叫wait方法(例如上面的this)

2.為什麼wait方法和notify方法定義在object這個類中

因為鎖物件可以是任意物件,object是所有類的基類,所以wait方法和notify方法需要定義在object類中

3.sleep方法和wait方法的區別

第乙個區別:sleep方法必須傳入引數,引數就是時間,時間到了自動醒來。wait方法可以傳入引數也可以不傳入引數,傳入引數就是在引數時間結束後等待,不傳入引數就是直接等待。

第二個區別:sleep方法在同步函式或者同步**塊中,不釋放鎖。wait方法在同步函式或者同步**塊中,釋放鎖。

JAVA基礎(多執行緒三個或三個以上間的執行緒通訊)

1,多個執行緒通訊的問題 public class demo2 notifyall catch interruptedexception e start new thread catch interruptedexception e start new thread catch interrupte...

三個執行緒,依次列印

程式設計實現三個執行緒abc,並讓它們順次列印abc 思路 設定三個訊號量 s1,s2,s3,s2由s1 post,s3由s2 post,s1由s3 post,由a執行緒先開始列印,其他執行緒必然在等待訊號量,所以三個執行緒一定會按照訊號量的順序來列印。注意vs 2015中多執行緒使用要呼叫wind...

iOS之多執行緒程式設計 三個層次執行緒應用

ios支援三個層次的執行緒程式設計,從底層到高層 層次越高使用越方便,越簡潔 分別是 1 thread 2 cocoa operations 3 grand central dispatch 簡介 thread是抽象層次最低的,另外兩種執行緒應用給予thread進行了封裝,對於程式設計師而言,thr...