Java基礎 執行緒間通訊

2021-07-03 00:14:53 字數 2780 閱讀 5175

執行緒間的通訊:其實就是多個執行緒操作同一資源,並且操作的動作不一樣,最簡單的例子:輸入輸出姓名、性別資訊。

執行緒同步保證了不會出現名字與性別對性錯誤的情況,等待喚醒機制保證了不會出現一次輸入多次輸出或多次輸入一次輸出的情況。等待、喚醒必須是同乙個鎖,喚醒機制職能喚醒跟它持有相同鎖的處於等待狀態的執行緒。

輸入輸出姓名、性別資訊的例子:

/*

執行緒間通訊,其實就是多個執行緒操作同乙個資源。

但操作的動作不同。

名詞提煉法:資源、兩個不同的操作

比如:乙個執行緒往裡面輸入名字和性別,另乙個執行緒取出名字和執行緒,分別簡稱為輸入執行緒和輸出執行緒。

為了保證輸入執行緒和輸出執行緒操作的是同一資源,資源物件應以引數的形式傳遞,需要達到的目

的是:輸入執行緒輸入乙個,輸出執行緒將其輸出,為避免發生輸入執行緒只輸入了名字

cpu執行權就被輸出執行緒搶走,以致輸出錯誤的資訊,應將使用執行緒同步;為避免輸入執行緒輸入一

次,輸出執行緒輸出多次(或輸入執行緒輸入多次,而輸出執行緒只輸出一次)的情況,應定義乙個標誌

位來判斷是否可輸入或可輸出,在不可輸入或不可輸出時,先讓執行緒等待,等被喚醒時判斷標

志位狀態。

步驟:1、定義一類描述資源:名字、性別、標誌位;

2、定義input類,實現runnable介面,一初始化就有了資源物件,複寫run方法;

3、定義output類,實現介面runnable,一出書畫就有了字眼物件,複寫run方法;

4、通過thread類建立執行緒;

5、分別將input、output的子類物件以引數的形式傳遞給thread類的建構函式;

6、呼叫執行緒的start類開啟執行緒。

其他說明:這個是最簡單的等待喚醒機制的體現,通俗的說,你操作一下,我操作一下,我操作結束

,進入等待之前會喚醒你,你操作結束,進入等待之前也要喚醒我。

等待喚醒機制:只能喚醒使用同乙個鎖的處於等待狀態的執行緒。

wait()、notify()、notifyall(),只能在同步**中才能使用,並且使用的時候要加上

該執行緒所屬的鎖(如:r.wait()、this.wait()),而鎖是任意物件,所以這些方法被定義

在object類中。wait()有申明異常,在runnable的run方法沒有拋異常,所以只能try處理,

不能拋。

關鍵點:1、定義標誌位來判斷是否可輸入或可輸出;

2、根據乙個變數的值來選擇輸入的資訊;(int i = 0 ;i = (i+1)%2;可以使i的值在0、1之間變換)

3、執行緒執行的**一般都是迴圈體;

4、資源物件以引數的形式傳遞可以保證,輸入和輸出操作的是同一物件。

*///定義描述資源的類

class

resource

//定義input類

class

input

implements

runnable

public

void run()

catch(exception e){}

if(i == 0)

else

i = (i+1)%2;

r.flag = true;

r.notify();

}}

}}//定義output類

class

output

implements

runnable

public

void run()

catch(exception e){}

system.out.println(r.name+"------"+r.***);

r.flag = false;

r.notify();}}

}}class

inputoutput

}

生產消費問題:

/*

生產消費模型:生產乙個消費乙個,並且是多個執行緒生產,多個執行緒消費。

名詞提煉法:資源、生產操作、消費操作。

判斷標誌if改while,是避免重複生產或重複消費的問題,用了while迴圈判斷之後會出現

所有執行緒都處於等待狀態,所以需要將notify改為notifyall。

注:notifyall喚醒的是全部處於等待狀態的執行緒,而不僅僅是對方執行緒。

*///定義資源類

class

rescatch(exception e){}

tostring = name+"----"+count++;

system.out.println("生產++++"+tostring);

this.notifyall();

flag = true;

}//消費的過程

public synchronized void get()

catch(exception e){}

system.out.println("消費===="+tostring);

this.notifyall();

flag = false;

}}//定義生產類

class

product

implements

runnable

public

void run()

}}//定義消費類

class

consumer

implements

runnable

public

void run()

}}class

procontest

}

java執行緒間通訊

執行緒間通訊 其實就是多個執行緒在操作同乙個資源,但是操作的動作不同 等待喚醒機制 wait notify notifyall 都是用在同步中,因為要對持有監視器 鎖 的執行緒操作。所以要是用在同步中,因為只有同步才具有鎖。等待喚醒必須是同乙個鎖,而鎖可以是任意物件,所以可以被任意物件呼叫的方法定義...

Java執行緒間通訊

要求用子執行緒和主線程實現 子執行緒輸出20次,主線程輸出50次,然後再子執行緒輸出20次,主線程輸出50次,如此迴圈20次 1 建立乙個用於輸出的業務類 business class business catch interruptedexception e for int i 0 i 10 i ...

java執行緒間通訊

執行緒間進行輸入 輸出通訊最常用的方式是 管道 方式。乙個執行緒從管道一端寫入資料,另乙個執行緒從管道另一端讀出資料。public class pipedio class pipesender extends thread public void run catch ioexception e cl...