多线程之生产者消费者基本实现——wait/notify

本文介绍了一种简单实现生产者消费者模式的方法,并通过Java代码示例详细解释了如何使用同步和等待来协调生产者和消费者之间的操作。此模式在多线程环境中用于解决资源竞争问题。

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

生产者消费者问题是在面试过程中被面试官问到的最多的线程方面的问题,所以在这里发一个生产者消费者的最简单的实现方式

这是我的生产工厂,有生产方法和消费方法,代码逻辑如下

public class Factory {

    private final int MAX_G = 100;
    private List<Object> list = new LinkedList<Object>();

//  生产num个货物
    public void product(int num){
            synchronized (list) {
//              如果仓库剩余容量不足以生产
                while(list.size()+num > MAX_G){
                    System.out.println("目前仓库容量:"+list.size()+",将生产"+num+"个货物,无法完成生产!");
                    try {
//                      产生阻塞
                        list.wait();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
//              否则有空余空间进行生产 就开始生产并加入list
                for (int i = 0; i < num; i++) {
                    list.add(new Object());
                }
                System.out.println("已经生产了"+num+"个货物,目前货物总数:"+list.size());
                list.notifyAll();
            }
    }

//  消耗num个货物
    public void consume(int num){
        synchronized (list) {
            while(list.size()<num){
                System.out.println("想要消耗"+num+"个货物,但是目前有"+list.size()+"个,不够消耗!");
                try {
                    list.wait();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            for (int i = 0; i < num; i++) {
                list.remove(0);
            }
            System.out.println("消耗了"+num+"个货物,目前还剩"+list.size()+"个货物");
            list.notifyAll();
        }
    }

    public List<Object> getList() {
        return list;
    }

    public void setList(List<Object> list) {
        this.list = list;
    }

    public int getMAX_G() {
        return MAX_G;
    }


}

这是我的线程中的具体代码,这个是生产者

public class Producter extends Thread{
    private Factory factory ;
    private int num;

    public Producter(Factory factory, int num) {
        this.factory = factory;
        this.num = num;
    }

    @Override
    public void run() {
        product(num);
    }

    public void product(int num){
        factory.product(num);
    }
}

这是我的消费者

public class Consume extends Thread{
    private Factory factory;
    private int num;
    public Consume(Factory factory, int num) {
        this.factory = factory;
        this.num = num;
    }

    @Override
    public void run() {
        consume(num);
    }

    public void consume(int num){
        factory.consume(num);
    }
}

测试类

public class Main {
    public static void main(String[] args) {
        Factory factory = new Factory();

        Producter p1 = new Producter(factory, 20);
        Producter p2 = new Producter(factory, 50);
        Producter p3 = new Producter(factory, 10);
        Producter p4 = new Producter(factory, 70);
        Producter p5 = new Producter(factory, 30);
        Producter p6 = new Producter(factory, 2);

        Consume c1 = new Consume(factory, 80);
        Consume c2 = new Consume(factory, 50);
        Consume c3 = new Consume(factory, 30);
        Consume c4 = new Consume(factory, 10);
        Consume c5 = new Consume(factory, 2);

        p1.start();
        p2.start();
        p3.start();
        p4.start();
        p5.start();
        p6.start();

        c1.start();
        c2.start();
        c3.start();
        c4.start();
        c5.start();
    }
}

以上执行结果如下图
这是生产者消费者执行结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值