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必須...