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

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

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

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();
    }
}

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

发布了31 篇原创文章 · 获赞 17 · 访问量 4万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览