Java實現線程通信的案例講解

什麼是線程通信、如何實現?

所謂線程通信就是線程間相互發送數據,線程通信通常通過共享一個數據的方式實現。

線程間會根據共享數據的情況決定自己該怎麼做,以及通知其他線程怎麼做。

線程通信常見模型

生產者與消費者模型:生產者線程負責生產數據,消費者線程負責消費數據。

要求:生產者線程生產完數據後,喚醒消費者,然後等待自己;消費者消費完該數據後,喚醒生產者,然後等待自己

public class 多線程_5線程通信 extends Thread{
 
    public static void main(String[] args) {
        //定義線程類,創建一個共享的賬戶對象
        account3 a=new account3("abc",0);
        //創建兩個取錢的線程對象
        new drawthread3(a,"小明").start();
        new drawthread3(a,"小紅").start();
        //創建三個存錢的線程對象
        new savethread(a,"存錢罐1號").start();
        new savethread(a,"存錢罐2號").start();
        new savethread(a,"存錢罐3號").start();
    }
}
//存錢的線程類
class savethread extends Thread{
    //接收處理的賬戶對象
    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{
    //接收處理的賬戶對象
    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();
                //鎖對象,讓當前線程進入等待
                this.wait();
            }else {
                //有錢,不存錢
                //喚醒所有線程
                this.notifyAll();
                //鎖對象,讓當前線程進入等待
                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();
                //鎖對象,讓當前線程進入等待
                this.wait();
            }else{
                //餘額不足
                //喚醒所有線程
                this.notifyAll();
                //鎖對象,讓當前線程進入等待
                this.wait();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上就是Java實現線程通信的案例講解的詳細內容,更多關於Java線程通信的資料請關註WalkonNet其它相關文章!

推薦閱讀: