简单的消费者生产者模式

本文通过一个简单的例子介绍消费者生产者模式,包括创建仓库类、生产者线程和消费者线程,模拟产品生产和消费的过程,并通过测试类展示三个生产者与三个消费者的交互效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

消费者生产者模式,就是在一个系统中,存在消费者生产者两种角色,他们通过缓冲区进行通信,生产者生产消费者所需的资料,消费者把资料制作成产品或使用
在这里插入图片描述
下面讲用一个简单的例子模拟生产者消费者模式
创建一个仓库类

import java.util.LinkedList;

public class MyStorage {

    LinkedList<Object> list = new LinkedList<>();          //定义集合,作为存储产品的容器
    private static final int MAX_CAPACITY = 100;

    //向仓库中存储产品
    public synchronized void store(String product) {

        //如果仓库已满,生产者等待
        while (list.size() > MAX_CAPACITY) {
            try {
                this.wait();       //wait()/notify()这两个需要在同步代码块中,通过锁对象调用
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println(Thread.currentThread().getName() + "++++++存储了:" + product);
        list.offer(product);        //把产品存储到后面
        //通知消费者消费
        this.notifyAll();
    }

    //从仓库中取产品
    public synchronized void take() {
        //判断仓库是否已空,当仓库为空时,需要等待
        while (list.size() <= 0) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        Object product = list.poll();     //把前面的产品取出来
        System.out.println(Thread.currentThread().getName() + "------消费了:" + product);

        //通知生产者继续生产
        this.notifyAll();
    }

}

创建生产者线程类

import java.util.Random;

/*
*
* 生产者线程类
*
* */
public class ProducerThread extends Thread {

    private MyStorage storage;     //仓库

    public ProducerThread(MyStorage storage) {
        super();
        this.storage = storage;
    }

    @Override
    //每个月工作30天,每天存1次
    public void run() {
        for (int i = 1; i <= 30; i++) {
            String product = "产品编号:" + new Random().nextInt(100);
            storage.store(product);
        }
    }
}

创建消费者线程类

/*
*
* 消费者线程类
* */
public class ConsummerThread extends Thread{

    private MyStorage storage;

    public ConsummerThread(MyStorage storage) {
        super();
        this.storage = storage;
    }

    @Override
    public void run() {
        //从仓库中取产品
        for (int i = 1; i <= 30; i++) {
            storage.take();
        }
    }
}

这是一个消费者生产产品,生产者使用产品的例子,创建一个测试类分别创建三个生产者和三个消费者来测试这些代码

/*
*
* 测试生产者消费者
*
* */
public class Test {
    public static void main(String[] args) {
        //先创建仓库
        MyStorage myStorage = new MyStorage();

        //创建三个生产者线程模拟三个人
        ProducerThread p1 = new ProducerThread(myStorage);
        ProducerThread p2 = new ProducerThread(myStorage);
        ProducerThread p3 = new ProducerThread(myStorage);
        p1.setName("lisisi");
        p2.setName("wangwu");
        p3.setName("chengqi");
        p1.start();
        p2.start();
        p3.start();

        //创建三个消费者
        ConsummerThread c1 = new ConsummerThread(myStorage);
        ConsummerThread c2 = new ConsummerThread(myStorage);
        ConsummerThread c3 = new ConsummerThread(myStorage);
        c1.setName("吃货1号");
        c2.setName("吃货2号");
        c3.setName("吃货3号");
        c1.start();
        c2.start();
        c3.start();


    }
}

得到的结果如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值