執行緒之間的通訊

2021-09-02 17:48:29 字數 2568 閱讀 3085

class res
class inthread extends thread 

@override

public void run() else

count = (count + 1) % 2;}}}

class outthread extends thread 

@override

public void run()

}}

資料發生錯亂,造成執行緒安全問題。

加鎖就可以了

生產者加鎖

class inthread extends thread

@override

public void run() else

count = (count + 1) % 2;}}

}}

消費者加鎖

class outthread extends thread

@override

public void run() }}

}

此時不會再出現執行緒安全問題,但是與預期結果還有差異,預期結果是生成乙個消費乙個,現在加了synchronized後,由於cpu排程,讀的執行緒會多次呼叫,所以可能會連續讀同乙個:

wait:暫停當前正在執行的執行緒,並釋放資源鎖,讓其他執行緒可以有機會執行

notify: 喚醒當前物件鎖池被等待執行緒,使之執行。

因為涉及到物件鎖,所以它們必須都放在synchronized中來使用. wait、notify一定要在synchronized裡面進行使用,並且對應同乙個鎖資源。

修改後的**:

package com.thread.communication;

/** * @author: 98050

* @time: 2018-12-05 23:19

* @feature:

*//**

* 共享物件

*/class res

/** * 寫入執行緒

*/class inthread extends thread

@override

public void run() catch (interruptedexception e)

}if (count == 0) else

count = (count + 1) % 2;

res.flag = true; //標記當前執行緒為等待

res.notify(); //喚醒被等待的執行緒}}

}}/**

* 讀取執行緒

*/class outthread extends thread

@override

public void run()

thread.sleep(1000);

} catch (interruptedexception e)

system.out.println("姓名:" + res.name + "," + "性別:" + res.***);

res.flag = false;//標記當前執行緒為等待

res.notify(); //喚醒被等待的執行緒}}

}}public class test001

}

效果:

join的原始碼:

public final synchronized void join(long millis) throws interruptedexception 

if (millis == 0)

} else

wait(delay);

now = system.currenttimemillis() - base;}}

}

注意這是乙個用synchronized修飾的方法,所以它是乙個同步方法。

邏輯:

由於join是synchronized修飾的同步方法,因此會出現join(long millis)阻塞時間超過了millis的值。

join方法內部是通過wait進行阻塞的,所以join和wait都會釋放鎖。而sleep不釋放鎖,sleep的鎖是當前執行緒物件。

釋放鎖和不釋放鎖的區別:釋放鎖後,該物件同步方法可被其他物件非同步呼叫,而不釋放鎖則該物件其他同步方法被呼叫時會進入等待獲得鎖。

wait和join喚醒後,需要重新獲得鎖。

程序之間 執行緒之間的通訊方式

1 程序間的8中通訊方式 1 無名管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 2 高階管道 popen 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方...

多執行緒之間通訊

多執行緒之間通訊,其實就是多個執行緒在操作同乙個資源,但是操作的動作不同。需求 第乙個執行緒寫入 input 使用者,另乙個執行緒取讀取 out 使用者.實現讀乙個,寫乙個操作。共享資源源實體類 class res輸入執行緒資源 class intthrad extends thread overr...

多執行緒之間通訊

多執行緒之間通訊 就是多個執行緒在操作同乙個資源,但是操作的動作不同 現在需要實現,生產一台電機,銷售一台電機問題。實現 執行結果 資料發生錯亂,造成執行緒安全問題 解決執行緒安全問題 通過wait notify來解決。wait和sleep的區別 wait可以指定時間也可以不指定時間,sleep必須...