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 @ 2022-04-01 00:05  Albert-ZZD  阅读(69)  评论(0)    收藏  举报