Java | 生产者和消费者模型

不爱生姜不吃醋⭐️
如果本文有什么错误的话欢迎在评论区中指正
与其明天开始,不如现在行动!


🌴前言

生产者消费者模型是很经典且具有代表性的进程同步问题,多用于多线程中,它是用于提高生产者和消费者之间交互信息的效率。本文以吃饭举例,客人为消费者,厨师为生产者。


🌴一、碗

客人吃饭需要用桌子,桌子有饭客人才能吃;厨师做好饭需要端到桌子上,不管是客人还是厨师都需要用到桌子。

public class Desk {
    public static int foodFlag = 0;//桌子上有没有饭
    public static int count = 10;//客人能吃几碗
    public static final Object lock = new Object();
}

🌴二、客人(消费者)

客人需要做的事情:
1.判断桌子上有没有食物
2.没有:等待
3.有:开吃
4.吃完后等厨师继续做,直到吃饱

public class Foodie extends Thread {
    @Override
    public void run() {
        while (true) {
            synchronized (Desk.lock) {
                if (Desk.count == 0) {
                    break;
                }
                if (Desk.foodFlag == 0) {
                    try {
                        Desk.lock.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                } else {
                    Desk.count--;
                    System.out.println("客人正在吃饭,还能吃" + Desk.count + "碗饭!");
                    Desk.lock.notifyAll();
                    Desk.foodFlag = 0;
                }
            }
        }
    }
}

🌴三.厨师(生产者)

厨师需要做的事情:
1.判断桌子上是否有食物
2.有:等待
3.没有:开始做饭
4.做好后放在桌子上,直到客人吃饱

public class Cook extends Thread {
    @Override
    public void run() {
        while (true) {
            synchronized (Desk.lock) {
                if (Desk.count == 0) {
                    break;
                }
                if (Desk.foodFlag == 1) {
                    try {
                        Desk.lock.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                } else {
                    System.out.println("厨师做好了一碗饭!");
                    Desk.foodFlag = 1;
                    Desk.lock.notifyAll();
                }
            }
        }
    }
}

🌴四、实现

启动线程,实现生产者和消费者模型。

public class ThreadDemo {
    public static void main(String[] args) {
        Cook c = new Cook();
        Foodie f = new Foodie();

        c.setName("厨师");
        f.setName("客人");

        c.start();
        f.start();
    }
}

🌴总结

文章中代码的编写使用的都是Java线程方面的知识,多加练习熟能生巧。
本文中若是有出现的错误请在评论区或者私信指出,我再进行改正优化,如果文章对你有所帮助,请给博主一个宝贵的三连,感谢大家😘!!!


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不爱生姜不吃醋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值