溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java如何實(shí)現(xiàn)線程通信

發(fā)布時(shí)間:2022-05-26 15:48:39 來(lái)源:億速云 閱讀:92 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下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)線程通信

以上就是“Java如何實(shí)現(xiàn)線程通信”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI