生产者消费者

生产者消费者的管道法实现,要注意不要把push和pop写错地儿了

package com.cooperation;

/**
 *项目名:生产者消费者管道法
 * 描述:多线程,容器{存取——无空间  并发——等待},操作馒头
 * @author : Lpc
 * @date : 2019-06-13 21:
 **/
public class ProduceAndConsumer {
    public static void main(String[] args) {
        SynContainer container = new SynContainer();
        new Productor(container).start();
        new Consumer(container).start();
    }
}
//生产者
class Productor extends Thread{
    SynContainer container;
    public Productor(SynContainer container){
        this.container = container;
    }
    @Override
    public void run(){
        //生产
        for (int i = 0; i < 100; i++) {
            System.out.println("生产第--》"+i+"个馒头");
            container.push(new Steamedbun(i));
        }
    }

}
//消费者
class Consumer extends Thread{

    SynContainer container;
    public Consumer(SynContainer container){
        this.container = container;
    }
    @Override
    public void run(){
        for (int i = 0; i < 100; i++) {
            System.out.println("消费");
            System.out.println("消费第--》"+container.pop().id+"个馒头");

        }
    }
}
//缓冲区
class SynContainer{
    Steamedbun[] buns = new Steamedbun[10];
    int count = 0;
    //存
    public synchronized void push(Steamedbun bun){
        //容器存在空间生产
        if (count==buns.length){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        buns[count++] = bun;
        this.notifyAll();
    }
    //获取
    public synchronized Steamedbun pop(){
        //容器中存在才能消费
        if (count == 0){
            try {
                this.wait();//线程阻塞,生产者通知消费结束阻塞
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        count--;
        this.notifyAll();
        return buns[count];
    }
}
//馒头
class Steamedbun{
    int id;

    public Steamedbun(int id) {
        this.id = id;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容