多執行緒通訊

2021-08-11 17:05:50 字數 1721 閱讀 1494

乙個類物件作為另乙個類的屬性,

你可以通過建構函式的形式傳遞進來。就是說當你想在乙個類a中使用另乙個類b的資料時,可以在該類a中定義b的物件b作為a的屬性,再把b作為乙個引數構造乙個建構函式,這樣就可以實現引數的傳遞,可以在類a中使用b的資料了(如果沒有理解錯應該是這樣子的意思)。

void wait()

使當前執行緒放棄同步鎖並進入等待狀態,直到其他執行緒進入此同步鎖,並呼叫notify()方法,或notifyall()方法喚醒該執行緒為止

void notify()

喚醒此同步鎖上等待的第乙個呼叫wait()方法的執行緒

viod notifyall()

喚醒此同步鎖上呼叫wait()方法的所有執行緒

多執行緒通訊利用wait()、notify()、notifyall()使得執行緒使多個執行緒按照一定的順序輪流執行。

注意:這三個方法的呼叫者都應該是同步鎖物件。

package study;

class storage

cells[inpos]=num;

system.out.println("在cells["+inpos+"]中放入資料---"+cells[inpos]);

inpos++;

if(inpos==cells.length)

inpos=0;

count++;

this.notify();

} catch (interruptedexception e)

}public synchronized void get()

int data=cells[outpos];

system.out.println("從cells["+outpos+"]中取出資料"+data);

cells[outpos]=0;

outpos++;

if(outpos==cells.length)

outpos=0;

count--;

this.notify();

} catch (interruptedexception e) }}

class input implements runnable

@override

public void run() }}

class output implements runnable

@override

public void run() }}

public class example17

}結果:

出現問題:

傳入put()的引數num初始值應該是0,不知道為什麼不能從0開始,即使是在定義屬性值num時賦值num=0也同樣不可以,找不出問題所在。

還有乙個問題是,wait()和notify()的定義中說」其他執行緒進入此同步鎖「,對於這點,目前的理解是這樣子的,不知道有沒有理解錯:

物件鎖是基於呼叫被synchronized修飾的方法所在的物件層次來講的,並不是之前理解的那樣是基於被synchronized修飾的方法的,同乙個類中會有兩個或者多個被synchronized修飾的方法,是為了使這兩個方法同步,所謂同步就是某個資源在同一時間內只能被乙個執行緒訪問。這裡的資源應該就是乙個物件鎖(應該可以這麼理解吧),被synchronized修飾的兩個或者多個方法是物件鎖內的同步的方法,不管多個執行緒利用同步方法中的哪個方法,只能有乙個執行緒占用該物件所。

執行緒通訊,多執行緒

多執行緒 thread handler thread處理一些複雜的業務邏輯 耗時的事情 handler在主線程中接收訊息的乙個物件 mhandler.sendmessage msg 傳送乙個訊息物件 mhandler.sendemptymessage what 傳送空訊息,只有what沒有obj m...

多執行緒 執行緒通訊

總結 今天小鹹兒來講解乙個好玩的事,那就是執行緒之間該如何通訊,執行緒通訊之後又會出現什麼問題?先來一張導圖來看看執行緒通訊的分布?疑問 如果想要執行緒按照使用者自定義的順序執行的話,那該如何操作呢?思考 如果能夠讓執行緒等待先執行的執行緒執行完,再執行不就能達到效果了嗎!果然出現問題之後,就會有對...

多執行緒 執行緒通訊

1.使用wait notify方法實現執行緒之間的通訊 1 有其他執行緒呼叫同乙個物件的notify或者notifyall方法 呼叫notify notifyall方法之前 2 被喚醒之後重新獲得物件的鎖 呼叫notify notifyall方法之後 編寫測試 如下 執行結果 2.管道通訊 管道流主...