生产者消费者问题 java实现

管程法

通过一个缓冲区来控制生产者和消费者的放入和消耗

public class PCdemo1 {
    public static void main(String[] args) {
        SynContainer container=new SynContainer();
        Producer producer=new Producer(container);
        Consumer consumer=new Consumer(container);
        new Thread(producer).start();
        new Thread(consumer).start();
    }
}
//需要 生产者,消费者,缓冲区,物品4个类
class Producer implements Runnable{
    SynContainer container;
    public Producer(SynContainer container) {
        this.container = container;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("生产了第"+i+"个物品 ");
            Item item=new Item(i);
            try {
                container.push(item);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
class Consumer implements Runnable{
    SynContainer container;
    public Consumer(SynContainer container) {
        this.container = container;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            try {
                System.out.println("使用了第"+container.consume().getId()+"物品");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
class SynContainer{
    //开辟一个能放10个物品的数组
    Item[] items=new Item[10];
    private int in=0;//放入的下标
    private int out=0;//拿出来的下标
    private int count=0;//计数器
    public synchronized void push(Item item) throws InterruptedException {
        int N=items.length;
        //如果满了 等待消费者
        while(count>=N){
            this.wait();
        }
        items[in]=item;
        in=(in+1)%N;
        count++;
        //物品放入 提醒消费者
        this.notifyAll();
    }
    public synchronized Item consume() throws InterruptedException {
        //没东西了 只能等
        Item item=null;
        int N=items.length;
        while(count<=0){
            this.wait();
        }
        count--;
        item=items[out];
        out=(out+1)%N;
        //物品消耗,提醒生产者
        this.notifyAll();
        return item;
    }
}
class Item{
    private int id;
    public Item(int id) {
        this.id = id;
    }
    public int getId() {
        return id;
    }
}

posted @ 2021-04-03 11:21  一个经常掉线的人  阅读(82)  评论(0编辑  收藏  举报