Java實(shí)現(xiàn)線程通信的案例講解
什么是線程通信、如何實(shí)現(xiàn)?
所謂線程通信就是線程間相互發(fā)送數(shù)據(jù),線程通信通常通過(guò)共享一個(gè)數(shù)據(jù)的方式實(shí)現(xiàn)。
線程間會(huì)根據(jù)共享數(shù)據(jù)的情況決定自己該怎么做,以及通知其他線程怎么做。
線程通信常見(jiàn)模型
生產(chǎn)者與消費(fèi)者模型:生產(chǎn)者線程負(fù)責(zé)生產(chǎn)數(shù)據(jù),消費(fèi)者線程負(fù)責(zé)消費(fèi)數(shù)據(jù)。
要求:生產(chǎn)者線程生產(chǎn)完數(shù)據(jù)后,喚醒消費(fèi)者,然后等待自己;消費(fèi)者消費(fèi)完該數(shù)據(jù)后,喚醒生產(chǎn)者,然后等待自己
public class 多線程_5線程通信 extends Thread{
public static void main(String[] args) {
//定義線程類,創(chuàng)建一個(gè)共享的賬戶對(duì)象
account3 a=new account3("abc",0);
//創(chuàng)建兩個(gè)取錢(qián)的線程對(duì)象
new drawthread3(a,"小明").start();
new drawthread3(a,"小紅").start();
//創(chuàng)建三個(gè)存錢(qián)的線程對(duì)象
new savethread(a,"存錢(qián)罐1號(hào)").start();
new savethread(a,"存錢(qián)罐2號(hào)").start();
new savethread(a,"存錢(qián)罐3號(hào)").start();
}
}
//存錢(qián)的線程類
class savethread extends Thread{
//接收處理的賬戶對(duì)象
private account3 acc;
public savethread(account3 acc,String name){
super(name);
this.acc=acc;
}
public void run(){
try {
while (true){
//存錢(qián)
acc.savemoney(100000);
//休眠2秒
Thread.sleep(2000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//取錢(qián)的線程類
class drawthread3 extends Thread{
//接收處理的賬戶對(duì)象
private account3 acc;
public drawthread3(account3 acc,String name){
super(name);
this.acc=acc;
}
public void run(){
try {
while (true){
//取錢(qián)
acc.drawmoney3(100000);
//休眠2秒
Thread.sleep(2000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class account3{
private String cartId;
private double money;//賬戶余額
public account3() {
}
public account3(String cartId, double money) {
this.cartId = cartId;
this.money = money;
}
public String getCartId() {
return cartId;
}
public void setCartId(String cartId) {
this.cartId = cartId;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public synchronized void savemoney(double money) {
//先獲取是誰(shuí)來(lái)存錢(qián),線程名即是人名
String name=Thread.currentThread().getName();
//判斷賬戶是否有錢(qián)
try {
if(this.money==0){
//沒(méi)錢(qián),存錢(qián)
this.money+=money;
System.out.println(name+"來(lái)存錢(qián),存了:"+money+"存錢(qián)后余額為:"+this.money);
//有錢(qián)了
//喚醒所有線程
this.notifyAll();
//鎖對(duì)象,讓當(dāng)前線程進(jìn)入等待
this.wait();
}else {
//有錢(qián),不存錢(qián)
//喚醒所有線程
this.notifyAll();
//鎖對(duì)象,讓當(dāng)前線程進(jìn)入等待
this.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized void drawmoney3(double money) {
//先獲取是誰(shuí)來(lái)取錢(qián),線程名即是人名
String name=Thread.currentThread().getName();
try {
//判斷賬戶是否夠錢(qián)
if(this.money>=money){
//有錢(qián),取錢(qián)
this.money-=money;
System.out.println(name+"來(lái)取錢(qián)成功,取了:"+money+"余額是:"+this.money);
//沒(méi)錢(qián)了
//喚醒所有線程
this.notifyAll();
//鎖對(duì)象,讓當(dāng)前線程進(jìn)入等待
this.wait();
}else{
//余額不足
//喚醒所有線程
this.notifyAll();
//鎖對(duì)象,讓當(dāng)前線程進(jìn)入等待
this.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上就是Java實(shí)現(xiàn)線程通信的案例講解的詳細(xì)內(nèi)容,更多關(guān)于Java線程通信的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解WebSocket+spring示例demo(已使用sockJs庫(kù))
本篇文章主要介紹了WebSocket spring示例demo(已使用sockJs庫(kù)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
SpringSecurity 自定義認(rèn)證登錄的項(xiàng)目實(shí)踐
本文主要介紹了SpringSecurity 自定義認(rèn)證登錄的項(xiàng)目實(shí)踐,以手機(jī)驗(yàn)證碼登錄為例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
在idea中設(shè)置項(xiàng)目編碼格式為UTF-8的操作方法
idea中的默認(rèn)編碼為GBK,在開(kāi)發(fā)過(guò)程中一般將編碼格式改為UTF-8,所以本文給大家介紹了在idea中設(shè)置項(xiàng)目編碼為UTF-8的操作方法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
java根據(jù)List內(nèi)對(duì)象的屬性排序方法
下面小編就為大家分享一篇java根據(jù)List內(nèi)對(duì)象的屬性排序方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
java微信開(kāi)發(fā)API第一步 服務(wù)器接入
這篇文章主要為大家分享了java微信開(kāi)發(fā)API的第一步操作服務(wù)器接入,感興趣的小伙伴們可以參考一下2016-05-05
Springboot教程之如何設(shè)置springboot熱重啟
這篇文章主要介紹了Springboot教程之如何設(shè)置springboot熱重啟,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Springboot?application.yml配置文件拆分方式
這篇文章主要介紹了Springboot?application.yml配置文件拆分方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
java多線程編程必備volatile與synchronized深入理解
這篇文章主要介紹了java多線程編程必備volatile與synchronized的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04

