生产者消费者
-
Object类中的等待和唤醒方法
方法名 说明 void wait () 导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法 void notify () 唤醒正在等待对象监视器的单个线程 void notifyAll () 唤醒正在等待对象监视器的所有线程 -
案例:生产者和消费者送牛奶和消费牛奶(奶箱:Box 生产者:Producer 消费者:Customer 测试类:BoxDemo)
//定义一个奶箱类 public class Box{ //定义一个成员变量表示第X瓶奶 private int milk; //定义一个成员变量,表示奶箱的状态(默认为空) private boolean state = false; //提供存储牛奶和获取牛奶的操作 public synchronized void put(int milk){ //如果有牛奶,等待消费 if(state){ try{wait();}catch (InterruptedException e){e.printStackTrace();} } //如果没有牛奶,就生产牛奶 this.milk = milk; System.out.println("送奶工将第"+this.milk+"瓶奶放入奶箱"); //生产完毕后,修改奶箱状态 state = true; //唤醒其他等待线程 notifyAll(); } public synchronized void get(){ //如果没有牛奶,等待生产 if(!state){ try{wait();}catch (InterruptedException e){e.printStackTrace();} } //如果有牛奶就消费牛奶 System.out.println("用户拿到第"+this.milk+"瓶奶"); //消费完毕后,修改奶箱状态 state = false; //唤醒其他等待线程 notifyAll(); } } //定义一个生产者类 public class Producer implements Runnable{ private Box b; public Producer(Box b){ //生成带参构造方法 this.b = b; } @Override public void run(){ //重写run()方法 for(int i = 0; i<5; i++){ b.put(i);//生产者生产5瓶牛奶 } } } //定义一个消费者类 public class Customer implements Runnable{ private Box b; public Customer(Box b){ this.b = b; } @Override public void run(){ while (true){ //消费者使用死循环来获取奶箱中的奶 b.get(); } } } //测试类 public class BoxDemo{ public static void main(String[] args){ //创建奶箱对象,为共享数据区域 Box b = new Box(); //创建生产者对象,把奶箱对象作为构造方法参数传递,因为在这个类中要调用存储牛奶操作 Producer p = new Producer(b); //创建消费者对象,把奶箱对象作为构造方法参数传递,因为在这个类中要调用存储牛奶操作 Customer c = new Customer(b); //创建2个线程对象,分别把生产者对象和消费者对象作为构造方法参数传递 Thread t1 = new Thread(p); Thread t2 = new Thread(c); //启动线程 t1.start(); t2.start(); } }