实践Java多线程——生产者消费者问题

实践Java多线程——生产者消费者问题,第1张

实践Java多线程——生产消费者问题 问题描述

假设仓库中只能存放一件产品,生产者将生产出的产品放入仓库,消费者将仓库的中的产品取走。仓库中没有产品,生产者将产品放入仓库,否则停止生成并等待,直到仓库中的产品被消费者取走仓库中存放产品,消费者将产品取出仓库,否则停止消费并等待,直到仓库中再次放入产品
解决办法:管程法

产品

class Product {
    int id;//产品编号

    public Product(int id) {
        this.id = id;
    }
}

缓存区

//缓冲区
class SynContainer {
    Product[] products = new Product[10];
    int count = 0;	    //容器计数器

    //生产者放入产品
    public synchronized void push(Product product) {
        while (count == products.length) {
            //通知消费者消费,等待生产
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //如果没有满,需要丢入产品
        products[count] = product;
        count++;
        //通知消费者消费
        this.notifyAll();
    }

    //消费者消费产品
    public synchronized Product pop() {
        //判断是否能消费
        while (count <= 0) {
            //等待生产者生产
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //如果可以消费
        count--;
        Product product = products[count];
        //吃完了 通知生产者生产
        this.notifyAll();
        return product;
    }
}

生产者

class Consumer extends Thread {
    //容缓冲区
    SynContainer container;

    public Consumer(SynContainer container) {
        this.container = container;
    }

    //消费
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("消费了-->" + container.pop().id + "件产品");
        }
    }
}

产生者

class Producer extends Thread {
    //容缓冲区
    SynContainer container;

    public Producer(SynContainer container) {
        this.container = container;
    }

    //生产
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            container.push(new Product(i));
            System.out.println("生产了" + i + "件产品");
        }
    }
}

main方法

public class Demo33_ThreadPC {
    public static void main(String[] args) {
        SynContainer synContainer = new SynContainer();
        new Producer(synContainer).start();
        new Consumer(synContainer).start();
    }
}

运行结果:

生产了0件产品
生产了1件产品
生产了2件产品
生产了3件产品
生产了4件产品
生产了5件产品
生产了6件产品
生产了7件产品
生产了8件产品
生产了9件产品
消费了-->9件产品
消费了-->10件产品
消费了-->8件产品
消费了-->7件产品
消费了-->6件产品
消费了-->5件产品
消费了-->4件产品
生产了10件产品
消费了-->3件产品
生产了11件产品
消费了-->11件产品
生产了12件产品
消费了-->12件产品
生产了13件产品
消费了-->13件产品
生产了14件产品
消费了-->14件产品
生产了15件产品
生产了16件产品
生产了17件产品
消费了-->15件产品
消费了-->18件产品
消费了-->17件产品
消费了-->16件产品
消费了-->2件产品
消费了-->1件产品
消费了-->0件产品
生产了18件产品
生产了19件产品
消费了-->19件产品

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5720103.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存