生产者消费者
生产者消费者模式概述


生产者消费者案例

//奶箱类
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();