Java-多线程----生产者/消费者模型

什么是生产者消费者模型?

        生产者消费者模型是一种常用的并发模式,用于解决生产者和消费者之间的协调问题。在这个模型中,生产者负责生产物品(例如食物),而消费者负责消费这些物品(例如学生用餐)。两者通过一个共享的队列进行沟通,从而实现数据的有效传递。

        通过这个模型,生产者可以在不需要等待消费者处理的情况下,将生成的食物放入队列中,而消费者则可以在队列中获取食物,避免了两者之间的强耦合。这种解耦设计提升了系统的灵活性和效率。

学校食堂中的应用场景

        在学校食堂的实际场景中,生产者可以是负责制作餐食的厨师,消费者则是前来就餐的学生。通过引入生产者消费者模型,可以在保证食物供应的同时,减少学生排队等待就餐的时间。以下是模型在学校食堂中的具体应用。

  1. 生产者(厨师):厨师根据预定的需求制作各种食物。例如,当食堂的食物存量低于一定值时,厨师会主动制作新的食物,并将其放入共享的食物列表中。

  2. 消费者(学生):学生根据自己的需求从食物列表中获取食物。在获取食物时,学生会检查列表是否为空,如果为空,则需要等待厨师制作新食物。

  3. 共享队列:食堂的食物列表充当生产者与消费者之间的缓冲区,确保双方可以高效地开展各自的任务。当厨师制作新食物时,通知学生可以消费;当学生消费食物时,通知厨师可以继续制作。(这里我们以List为例,不采用队列了)

代码示例

以下是一个简单的Java代码示例,展示了如何使用生产者消费者模型来模拟学校食堂的运营。

Food类

通过构造器创建食物,我们下面以汉堡为例

package com.ffyc.homework;

class Food {
    private String name;

    public Food(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Producer类(实现了Runnable接口)

package com.ffyc.homework;

public class Producer implements Runnable {
    @Override
    public void run() {
        while (true) {
            synchronized (MidContainer.foodList) {
                if (MidContainer.foodList.size() < MidContainer.MAX_FOOD) {
                    // 模拟食堂制作食物
                    Food food = new Food("汉堡" + (MidContainer.foodList.size() + 1));
                    MidContainer.foodList.add(food);
                    System.out.println(Thread.currentThread().getName() + " 生产了食物: " + food.getName());
                    try {
                        Thread.sleep(500); // 模拟制作时间
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    MidContainer.foodList.notifyAll(); // 通知消费者有新食物可用
                } else {
                    try {
                        MidContainer.foodList.wait(); // 食物满了,生产者等待
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                }
            }
        }
    }
}

 Consumer类(实现了Runnable接口)

代表学生,进行食物的消费

package com.ffyc.homework;

public class Consumer implements Runnable {
    @Override
    public void run() {
        while (true) {
            synchronized (MidContainer.foodList) {
                if (MidContainer.foodList.isEmpty()) {
                    try {
                        MidContainer.foodList.wait(); // 食物为空,消费者等待
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                } else {
                    // 模拟学生获取食物
                    Food food = MidContainer.foodList.remove(0);
                    System.out.println(Thread.currentThread().getName() + " 消费了食物: " + food.getName());
                    try {
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    MidContainer.foodList.notifyAll(); // 通知生产者有空间可用
                }
            }
        }
    }
}

MidContainer类

设置List的一些属性,比如容量(50)

package com.ffyc.homework;

import java.util.ArrayList;
import java.util.List;

public class MidContainer {
        public static final int MAX_FOOD = 50; // 最大食物数量
        public static List<Food> foodList = new ArrayList<>();
}

SchoolCanteen类

作为程序的入口,进行生产与消费的迭代模拟

package com.ffyc.homework;

public class SchoolCanteen {
    public static void main(String[] args) {
        Producer producer = new Producer();
        Consumer consumer = new Consumer();

        // 创建多个生产者和消费者线程
        Thread producerThread = new Thread(producer, "食堂");
        Thread consumerThread1 = new Thread(consumer, "学生1");
        Thread consumerThread2 = new Thread(consumer, "学生2");

        producerThread.start();
        consumerThread1.start();
        consumerThread2.start();
    }
}

效果演示

通过模拟,可以很好的找到供求关系,是该提高生产还是促进消费

总结

        通过实现生产者消费者模型,学校食堂能够更高效地运作,从而提升就餐体验。这一模式不仅有助于减少等待时间,确保食物的新鲜供应,还为管理者提供了清晰的运营思路。随着技术的进步,未来的食堂可能会结合智能化系统和数据分析,对生产和消费进行更深入的优化,实现更加人性化和高效的服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值