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

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

 更新時(shí)間:2022年05月26日 14:17:08   作者:遇安.112  
所謂線程通信就是線程間相互發(fā)送數(shù)據(jù),線程通信通常通過共享一個(gè)數(shù)據(jù)的方式實(shí)現(xiàn)。本文將通過案例詳解Java中線程通信的實(shí)現(xiàn),感興趣的可以了解一下

什么是線程通信、如何實(shí)現(xiàn)?

所謂線程通信就是線程間相互發(fā)送數(shù)據(jù),線程通信通常通過共享一個(gè)數(shù)據(jù)的方式實(shí)現(xiàn)。

線程間會(huì)根據(jù)共享數(shù)據(jù)的情況決定自己該怎么做,以及通知其他線程怎么做。

線程通信常見模型

生產(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) {
        //先獲取是誰來存錢,線程名即是人名
        String name=Thread.currentThread().getName();
        //判斷賬戶是否有錢
        try {
            if(this.money==0){
                //沒錢,存錢
                this.money+=money;
                System.out.println(name+"來存錢,存了:"+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) {
        //先獲取是誰來取錢,線程名即是人名
        String name=Thread.currentThread().getName();
        try {
            //判斷賬戶是否夠錢
            if(this.money>=money){
                //有錢,取錢
                this.money-=money;
                System.out.println(name+"來取錢成功,取了:"+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();
        }
    }
}

以上就是Java實(shí)現(xiàn)線程通信的案例講解的詳細(xì)內(nèi)容,更多關(guān)于Java線程通信的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解WebSocket+spring示例demo(已使用sockJs庫)

    詳解WebSocket+spring示例demo(已使用sockJs庫)

    本篇文章主要介紹了WebSocket spring示例demo(已使用sockJs庫),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • SpringSecurity 自定義認(rèn)證登錄的項(xiàng)目實(shí)踐

    SpringSecurity 自定義認(rèn)證登錄的項(xiàng)目實(shí)踐

    本文主要介紹了SpringSecurity 自定義認(rèn)證登錄的項(xiàng)目實(shí)踐,以手機(jī)驗(yàn)證碼登錄為例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • 在idea中設(shè)置項(xiàng)目編碼格式為UTF-8的操作方法

    在idea中設(shè)置項(xiàng)目編碼格式為UTF-8的操作方法

    idea中的默認(rèn)編碼為GBK,在開發(fā)過程中一般將編碼格式改為UTF-8,所以本文給大家介紹了在idea中設(shè)置項(xiàng)目編碼為UTF-8的操作方法,文中通過圖文介紹的非常詳細(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ì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • java微信開發(fā)API第一步 服務(wù)器接入

    java微信開發(fā)API第一步 服務(wù)器接入

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

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

    這篇文章主要介紹了Springboot教程之如何設(shè)置springboot熱重啟,本文通過實(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)目開發(fā)過程中,使用properties文件作為配置基本上是必不可少的,有很多如系統(tǒng)配置信息,java如何遍歷properties文件呢,本文將詳細(xì)介紹,希望可以幫助到您
    2012-11-11

最新評(píng)論

共和县| 镇沅| 黔西县| 桃源县| 万年县| 平陆县| 台南市| 平湖市| 高台县| 高清| 灵石县| 上犹县| 岳阳市| 邵阳县| 信丰县| 赫章县| 平阴县| 廊坊市| 台东县| 溧阳市| 汾西县| 扎囊县| 太康县| 冀州市| 景泰县| 丰台区| 扎囊县| 图们市| 博乐市| 呼玛县| 碌曲县| 洪洞县| 牡丹江市| 广水市| 瑞金市| 九龙城区| 永福县| 衡山县| 巍山| 胶南市| 丰县|