黑马程序员技术交流社区

标题: 你们知道这个程序哪里出现问题了么 运行不了? [打印本页]

作者: 房小威    时间: 2014-12-28 18:36
标题: 你们知道这个程序哪里出现问题了么 运行不了?
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();
               
        }
}
作者: outsider1020    时间: 2014-12-28 19:23
Exit类中run方法p.wait(),此处不应该使用wait()方法,应该使用sleep()方法。这里的exit和enter是使用同一把对象锁的,而wait()在等待过程中是释放对象锁的,而sleep()是不会释放对象锁的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2