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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙沛 中级黑马   /  2012-9-10 10:53  /  1587 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

上午学了锁,敲了代码,可是怎么调试都报错java.lang.IllegalMonitorStateExceptionimport java.lang.Thread;
class Res{
        String name;
        String sex;
        boolean flag = false;
}
class Input implements Runnable{
        private Res r;
        Input(Res r){
                this.r = r;
        }
        public void run(){
                int x = 0;
                while(true){
                        synchronized (r){
                                if(r.flag){
                                        try {
                                                wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                }                                       
                                if(x == 0){
                                        r.name = "nike";
                                        r.sex = "man";
                                }else{
                                        r.name = "apple";
                                        r.sex = "girl";
                                }
                                x = (x+1)%2;
                                r.flag = true;
                                r.notify();
                        }
                }
        }
}
class Output implements Runnable{
        private Res r;
        Output(Res r){
                this.r = r;
        }       
        public void run(){
                int x = 0;
                while(true){
                        synchronized (r){
                                if(!r.flag){
                                        try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                }                                       
                                System.out.println(r.name+"..."+r.sex);
                                r.flag = false;
                                r.notify();
                        }
                }
        }
}
class InputOutputDemo{
        public static void main(String[] args){
                Res r = new Res();
                Input in = new Input(r);
                Output out = new Output(r);
               
                Thread t1 = new Thread(in);
                Thread t2 = new Thread(out);
                t1.start();
                t2.start();
        }       
}
也不知道错在哪里,检查不出来,麻烦解决下


5 个回复

倒序浏览
哈哈,我知道哪里错了
wait的时候,没有指定对象
回复 使用道具 举报
class Res{
         String name;
         String sex;
         boolean flag = false;
}
class Input implements Runnable{
         private Res r;
         Input(Res r){
                 this.r = r;
         }
         public void run(){
                 int x = 0;
                 while(true){
                         synchronized (r){
                                 if(r.flag){
                                         try {
                                                 r.wait();//这里改成r.wait()
                                         } catch (InterruptedException e) {
                                                 e.printStackTrace();
                                         }
                                 }                                       
                                if(x == 0){
                                         r.name = "nike";
                                         r.sex = "man";
                                 }else{
                                         r.name = "apple";
                                         r.sex = "girl";
                                 }
                                 x = (x+1)%2;
                                 r.flag = true;
                                 r.notify();
                         }
                 }
         }
}
class Output implements Runnable{
         private Res r;
         Output(Res r){
                 this.r = r;
         }        
        public void run(){
                 int x = 0;
                 while(true){
                         synchronized (r){
                                 if(!r.flag){
                                         try {
                                                 r.wait();
                                         } catch (InterruptedException e) {
                                                 e.printStackTrace();
                                         }
                                 }                                       
                                System.out.println(r.name+"..."+r.sex);
                                 r.flag = false;
                                 r.notify();
                         }
                 }
         }
}
class InputOutputDemo{
         public static void main(String[] args){
                 Res r = new Res();
                 Input in = new Input(r);
                 Output out = new Output(r);
                 
                Thread t1 = new Thread(in);
                 Thread t2 = new Thread(out);
                 t1.start();
                 t2.start();
         }        
}
回复 使用道具 举报
Input 类里面的wait()  前面要加上  r.     不然怎么会知道谁wait了
回复 使用道具 举报
package com.itheima.test;

class Res{
    String name;
    String sex;
    boolean flag = false;
}
class Input implements Runnable{
    private Res r;
    Input(Res r){
            this.r = r;
    }
    public void run(){
            int x = 0;
            while(true){
                    synchronized (r){
                            if(!r.flag){//①
                                    try {
                                            r.wait();//②
                                    } catch (InterruptedException e) {
                                            e.printStackTrace();
                                    }
                            }                                       
                           if(x == 0){
                                    r.name = "nike";
                                    r.sex = "man";
                            }else{
                                    r.name = "apple";
                                    r.sex = "girl";
                            }
                            x = (x+1)%2;
                            r.flag = true;
                            r.notify();
                    }
            }
    }
}
class Output implements Runnable{
    private Res r;
    Output(Res r){
            this.r = r;
    }        
   public void run(){
            int x = 0;
            while(true){
                    synchronized (r){
                            if(r.flag){//③
                                    try {
                                            r.wait();
                                    } catch (InterruptedException e) {
                                            e.printStackTrace();
                                    }
                            }                                       
                           System.out.println(r.name+"..."+r.sex);
                            r.flag = false;
                            r.notify();
                    }
            }
    }
}
public class InputOutputDemo{
    public static void main(String[] args){
            Res r = new Res();
            Input in = new Input(r);
            Output out = new Output(r);
            
           Thread t1 = new Thread(in);
            Thread t2 = new Thread(out);
            t1.start();
            t2.start();
    }        
}

在①、②和③处做程序中的修改,亦可以实现
回复 使用道具 举报

class Res{
        String name;
        String sex;
        boolean flag = false;
        }
class Input implements Runnable{
        private Res r;
        Input(Res r){
                this.r = r;
        }
        public void run(){
                int x = 0;
                while(true){
                        synchronized (r){
                                if(r.flag){
                                        try {
                                                r.wait();//这里要为其指定对象的                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                }                                       
                                if(x == 0){
                                        r.name = "nike";
                                        r.sex = "man";
                                }else{
                                        r.name = "apple";
                                        r.sex = "girl";
                                }
                                x = (x+1)%2;
                                r.flag = true;
                                r.notify();
                        }
                }
        }
}
class Output implements Runnable{
        private Res r;
        Output(Res r){
                this.r = r;
        }        
        public void run(){
                int x = 0;
                while(true){
                        synchronized (r){
                                if(!r.flag){
                                        try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                }                                       
                                System.out.println(r.name+"..."+r.sex);
                                r.flag = false;
                                r.notify();
                        }
                }
        }
}
class InputOutputDemo{
        public static void main(String[] args){
                Res r = new Res();
                Input in = new Input(r);
                Output out = new Output(r);
               
                Thread t1 = new Thread(in);
                Thread t2 = new Thread(out);
                t1.start();
                t2.start();
        }        
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马