publicclassBox{privateint milk =0;//定义一个成员变量,表示奶箱的状态(是否有牛奶)privateboolean state =false;publicintgetMilk(){return milk;}publicvoidsetMilk(int milk){this.milk = milk;}//如果没有synchronized关键字:IllegalMonitorStateException//官方文档:抛出该异常表明某一线程已经试图等待对象的监视器(监视器相当锁对象),或者试图通知其他正在等待对象的监视器,然而本身没有指定了监视器的线程。//这个异常表名:一个线程尝试让一个对象的锁进入等待状态,或者尝试去唤醒其他线程中处于等待状态的对象的锁,然而这个线程根本就没有锁//也就是当前的线程不是此对象监视器的所有者。当前线程要锁定该对象之后,才能用锁定的对象执行这些方法。publicsynchronizedvoiddepositMilk(int milk){//如果有牛奶,等待消费if(state){try{//IllegalMonitorStateExceptionwait();}catch(InterruptedException e){
e.printStackTrace();}}//如果没有牛奶,就存放牛奶this.milk = milk;System.out.println("送奶小哥将第"+this.milk +"瓶奶放入奶箱");//生产完毕后,修改奶箱状态
state =true;//唤醒其他等待的线程notifyAll();}publicsynchronizedvoidtakeMilk(){//如果没有牛奶,等待生产if(!state){try{wait();}catch(InterruptedException e){
e.printStackTrace();}}//如果有牛奶,就消费牛奶System.out.println("消费者拿到第"+this.milk +"瓶奶");//消费完毕之后,修改奶箱状态
state =false;//唤醒其他等待的线程notifyAll();}}
publicclassBoxDemo{publicstaticvoidmain(String[] args){Box b =newBox();Producer p =newProducer(b);Customer c =newCustomer(b);Thread t1 =newThread(p);Thread t2 =newThread(c);
t1.start();
t2.start();}}