A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package myproject;
class Pool{
        int volume=20;
        boolean flag=false;
       
}
class Enter extends Thread{
        Pool p;
        public Enter(Pool p){
                this.p=p;
        }
        @Override
        public void run() {
                int i=0;
                while(true){
                        synchronized (p) {
                                if(p.flag){
                                        if(i<=p.volume){
                                                System.out.println("水池的水已有"+i);
                                                i+=5;
                                               
                                        }else{
                                                System.out.println("水池已经注满");
                                                p.flag=false;
                                                p.notifyAll();
                                        }
                                }else{
                                        try {
                                                p.wait();
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                }
                        }
                       
                }
        }
                                                               
}
       
class Exit extends Thread{
        Pool p;
        public Exit(Pool p){
                this.p=p;
        }
        public void run(){
                int i=p.volume;
                while(true){
                        if(!p.flag){
                                synchronized (p) {
                                        if(i>=0){
                                                System.out.println("水池已经放掉了"+i);
                                                i-=2;
                                        }else{
                                                System.out.println("水池已经放空了...");
                                                p.flag=true;
                                                p.notifyAll();
                                        }
                                }
                        }else{
                                try {
                                        p.wait();
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        }
                       
                }
        }
       
}
       
class Test{
        public static void main(String[] args) {
                Pool p=new Pool();
                Enter enter=new Enter(p);
                Exit exit=new Exit(p);
                exit.start();
                enter.start();
               
        }
}

1 个回复

倒序浏览
Exit类中run方法p.wait(),此处不应该使用wait()方法,应该使用sleep()方法。这里的exit和enter是使用同一把对象锁的,而wait()在等待过程中是释放对象锁的,而sleep()是不会释放对象锁的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马