生产者消费者
-
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;}@Overridepublic 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;}@Overridepublic 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();} }