您好,登錄后才能下訂單哦!
今天小編給大家分享一下Java如何實(shí)現(xiàn)線程通信的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
什么是線程通信、如何實(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è)取錢的線程對(duì)象 new drawthread3(a,"小明").start(); new drawthread3(a,"小紅").start(); //創(chuàng)建三個(gè)存錢的線程對(duì)象 new savethread(a,"存錢罐1號(hào)").start(); new savethread(a,"存錢罐2號(hào)").start(); new savethread(a,"存錢罐3號(hào)").start(); } } //存錢的線程類 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){ //存錢 acc.savemoney(100000); //休眠2秒 Thread.sleep(2000); } } catch (Exception e) { e.printStackTrace(); } } } //取錢的線程類 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){ //取錢 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)存錢,線程名即是人名 String name=Thread.currentThread().getName(); //判斷賬戶是否有錢 try { if(this.money==0){ //沒(méi)錢,存錢 this.money+=money; System.out.println(name+"來(lái)存錢,存了:"+money+"存錢后余額為:"+this.money); //有錢了 //喚醒所有線程 this.notifyAll(); //鎖對(duì)象,讓當(dāng)前線程進(jìn)入等待 this.wait(); }else { //有錢,不存錢 //喚醒所有線程 this.notifyAll(); //鎖對(duì)象,讓當(dāng)前線程進(jìn)入等待 this.wait(); } } catch (Exception e) { e.printStackTrace(); } } public synchronized void drawmoney3(double money) { //先獲取是誰(shuí)來(lái)取錢,線程名即是人名 String name=Thread.currentThread().getName(); try { //判斷賬戶是否夠錢 if(this.money>=money){ //有錢,取錢 this.money-=money; System.out.println(name+"來(lái)取錢成功,取了:"+money+"余額是:"+this.money); //沒(méi)錢了 //喚醒所有線程 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)線程通信”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。