最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)線程通信的案例講解

 更新時(shí)間:2022年05月26日 14:17:08   作者:遇安.112  
所謂線程通信就是線程間相互發(fā)送數(shù)據(jù),線程通信通常通過(guò)共享一個(gè)數(shù)據(jù)的方式實(shí)現(xiàn)。本文將通過(guò)案例詳解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) {
        //定義線程類(lèi),創(chuàng)建一個(gè)共享的賬戶(hù)對(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)的線程類(lèi)
class savethread extends Thread{
    //接收處理的賬戶(hù)對(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)的線程類(lèi)
class drawthread3 extends Thread{
    //接收處理的賬戶(hù)對(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;//賬戶(hù)余額
 
    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();
        //判斷賬戶(hù)是否有錢(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 {
            //判斷賬戶(hù)是否夠錢(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ù))

    本篇文章主要介紹了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í)踐

    本文主要介紹了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中設(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并發(fā)之ReentrantLock

    淺談JAVA并發(fā)之ReentrantLock

    本文主要介紹了基于AQS實(shí)現(xiàn)的ReentrantLock(重入鎖),感興趣的同學(xué),可以參考下。
    2021-06-06
  • java根據(jù)List內(nèi)對(duì)象的屬性排序方法

    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ù)器接入

    這篇文章主要為大家分享了java微信開(kāi)發(fā)API的第一步操作服務(wù)器接入,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Springboot教程之如何設(shè)置springboot熱重啟

    Springboot教程之如何設(shè)置springboot熱重啟

    這篇文章主要介紹了Springboot教程之如何設(shè)置springboot熱重啟,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Springboot?application.yml配置文件拆分方式

    Springboot?application.yml配置文件拆分方式

    這篇文章主要介紹了Springboot?application.yml配置文件拆分方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java多線程編程必備volatile與synchronized深入理解

    java多線程編程必備volatile與synchronized深入理解

    這篇文章主要介紹了java多線程編程必備volatile與synchronized的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • java遍歷properties文件操作指南

    java遍歷properties文件操作指南

    在java項(xiàng)目開(kāi)發(fā)過(guò)程中,使用properties文件作為配置基本上是必不可少的,有很多如系統(tǒng)配置信息,java如何遍歷properties文件呢,本文將詳細(xì)介紹,希望可以幫助到您
    2012-11-11

最新評(píng)論

濉溪县| 山西省| 丹阳市| 通城县| 二连浩特市| 聂荣县| 嵊州市| 万山特区| 通城县| 峡江县| 湘乡市| 大竹县| 三江| 鄂尔多斯市| 大田县| 濉溪县| 台中市| 阿瓦提县| 牙克石市| 黄浦区| 平乡县| 探索| 甘泉县| 南江县| 资中县| 成武县| 赣州市| 平定县| 静宁县| 娄底市| 兴和县| 玛多县| 郸城县| 无极县| 贞丰县| 阜宁县| 府谷县| 兴山县| 康乐县| 青铜峡市| 双城市|