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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class InputOutputDemo2 {
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                res1 r = new res1();
                new Thread(new Input1(r)).start();
                new Thread(new Output1(r)).start();
        }

}

class res1{
        private String name;
        private String sex;
        private Boolean flag = false;
        public synchronized void in(String name,String sex){
                if(!flag){
                        this.name = name;
                        this.sex = sex;
                        flag = true;
                        notify();                       
                }else{//检查了很久发现是此套了一个else 导致程序错误,有没有人知道 为什么这里加个else 就不行?
                        try{                                                                               
                                wait();                                                                                       
                        }catch(Exception e){                                       
                                System.out.println(e.toString());
                        }
               }                               
        }
        public synchronized void out(){
                if(flag){
                        System.out.println(this.name+".........."+this.sex);
                        flag = false;
                        notify();
                }else{
                        try{
                                wait();
                        }catch(Exception e){
                                System.out.println(e.toString());
                        }
                }
        }
}
class Input1 implements Runnable{
        private res1 r;
        Input1(res1 r){
                this.r = r;
        }
        int i = 0;
        public  void  run(){               
                while(true){
                        if(i==0){
                                r.in("lily", "female");
                        }else{
                                r.in("孙", "男");                       
                        }
                        i = (i+1)%2;                                               
                }                                                  
        }
}

class Output1 implements Runnable{
        private res1 r;
        Output1(res1 r){
                this.r = r;
        }
        public void  run(){               
                while(true){
                                r.out();                                               
                }                                                                       
        }
}


这个代码无法实现生产一个消费一个,检查了很久 ,是多套了一个else,但是想了很久也不清楚加了else为什么不行? 哪个达人知道、、、、、、、、、、、、、、、、、、、、、

1 个回复

倒序浏览
一开始 flag是 flase 那么 第一个线程 开始执行   
                        this.name = name;
                        this.sex = sex;
                        flag = true;
                        notify();  
它执行的时候 持有锁  此时 out并不能执行  那么  你notify了谁?   这时  in方法执行完了 释放了锁 如果 此时 out抢到了执行权 那么 它开始执行  它把 flag搞成了 false 它又在 notify  它 notify了谁?  所以 你这方法 逻辑 就有 问题  再好好 整理下下 思路吧 少年
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马