生产者消费者

生产者消费者

生产者消费者模式概述

image.png
image.png

生产者消费者案例

image.png

//奶箱类
public class Box{
    //定义一个成员变量,表示第x瓶奶
    private int milk;
    
    //定义一个成员变量表示奶箱的状态
    private boolean state = false;
    //提供存储牛奶和获取牛奶的操做
    public synchronized void put(int milk){
        //若是有牛奶,应该是等待消费
        if(state){
            wait();//alt enter捕获异常
        }
        //若是没有牛奶,就生产牛奶
        this.milk = milk;
        sout("送奶工将第"+this.milk+"瓶奶放入奶箱"); 
        //生产完毕以后,就要修改奶箱状态
        state = true;
        //而后还要唤醒其余等待的线程
        notifyAll();
        
    }
    public synchronized void get(int milk){
        //若是没有牛奶,等待生产
        if(!state){
            wait();//alt enter捕获异常
        }
        //若是有牛奶,就消费牛奶
        this.milk = milk;
        sout("用户拿到第"+this.milk+"瓶奶"); 
        //消费完毕以后,就要修改奶箱状态
        state = false;
        //而后还要唤醒其余等待的线程
        notifyAll();
    }
}

//生产者类
public class Producer implements Runnable{
    private Box b;
    public Producer(Box b){
        this.b = b;
    }
    @Override
    public void run(){
        for(int i=1;i<=5;i++){
            b.put(i);
        }
}

//消费者类
public class Customer implements Runnable{
    private Box b;
    public Customer (Box b){
        this.b = b;
    }
    @Override
    public void run(){
        while(true){
            b.get();
        }
    }
}

//测试类 主程序
//建立奶箱对象,这事共享数据区域
Box b = new Box();
//建立生产者对象,把奶箱对象做为构造方法参数传递,由于再这个类中要调用存储牛奶的操做
Producer p = new Producer(b);
//建立消费者对象,把奶箱对象做为构造方法参数传递,由于再这个类中要调用获取牛奶的操做
Customer c = new Customer (b);
//建立两个线程对象,分别把生产者对象和消费者对象为构造方法参数传递
Thread t1 = new Thread(p);
Thread t2 = new Thread(c);
//启动线程
t1.start();
t2.start();
相关文章
相关标签/搜索