栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

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

实践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件产品
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/724556.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号