不爱生姜不吃醋⭐️
如果本文有什么错误的话欢迎在评论区中指正
与其明天开始,不如现在行动!
🌴前言
生产者消费者模型是很经典且具有代表性的进程同步问题,多用于多线程中,它是用于提高生产者和消费者之间交互信息的效率。本文以吃饭举例,客人为消费者,厨师为生产者。
🌴一、碗
客人吃饭需要用桌子,桌子有饭客人才能吃;厨师做好饭需要端到桌子上,不管是客人还是厨师都需要用到桌子。
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线程方面的知识,多加练习熟能生巧。
本文中若是有出现的错误请在评论区或者私信指出,我再进行改正优化,如果文章对你有所帮助,请给博主一个宝贵的三连,感谢大家😘!!!