Java_多线程等待唤醒机制案例

以消费者吃包子、生产者卖包子为例,显现生产者和消费者之间的多线程通信


public class SellBaozi {
//main方法
    public static void main(String[] args) {
       
        Baozi baozi = new Baozi();
        Buyer buyer = new Buyer(baozi);
        Seller seller = new Seller(baozi);

        new Thread(buyer).start();//买

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(seller).start();
    }
}

//包子类
class Baozi {
    boolean statue = true;

    void Baozi() {
    }

    public boolean isStatue() {
        return statue;
    }

    public void setStatue(boolean statue) {
        this.statue = statue;
    }
}

//消费者
class Buyer implements Runnable {
    Baozi b;

    public Buyer(Baozi b) {
        this.b = b;
    }

    @Override
    public void run() {
        buyBaozi(b);
    }

    void buyBaozi(Baozi b) {
        while (true) {
            synchronized ("a") {
                if (b.statue) {//有包子
                    System.out.println("吃包子,好香啊");
                    b.setStatue(false);//无包子
                    "a".notify();
                } else {

                    System.out.println("等包子");

                    try {
                        "a".wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

//生产者
class Seller implements Runnable {
    Baozi b;

    public Seller(Baozi b) {
        this.b = b;
    }

    @Override
    public void run() {
        makeBaozi(b);

    }

    private void makeBaozi(Baozi b) {
        while (true) {
            synchronized ("a") {
                if( !(b.statue)) {//无包子

                    System.out.println("做包子。。。猪肉馅的");

                    b.setStatue(true);
                    "a".notify();

                } else {//无包子
                    System.out.println("卖包子");
                    try {
                        "a".wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        }
    }
}

代码执行结果

吃包子,好香啊
等包子
做包子。。。猪肉馅的
卖包子
吃包子,好香啊
等包子
做包子。。。猪肉馅的
卖包子

小结:

  • 锁唤醒机制中必须使用的是同一个锁"a"Synchronized
  • 代码逻辑实现中注意Baozi类的状态切换
  • 代码业务逻辑的校验,可以通过个别案例的实施流程来进行测试;
posted @   Albert-ZZD  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示