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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 穆爱明 高级黑马   /  2013-6-12 23:34  /  1543 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 穆爱明 于 2013-6-13 17:03 编辑

今天看day12的多线程,然后自己敲代码运行,但运行结果却不同,开始以为自己敲错了,仔细检查了好几遍,发现比老师的代码多了红色的部分,并且自己在set方法上打了断点调试,奇怪的是调试的输出结果和老师的一样,但一运行结果就不同了。开始我以为我的代码是规范写法,并且是按逻辑加的,老师的只是简便写法罢了,谁知道结果却差别很大。不知哪位同学能够帮忙解答一下其中的不同,不胜感激呀!

class Res
{
        private String name;
        private String sex;
        private boolean flag = false;
        public synchronized void set(String name,String sex)
        {
                if(flag){
                        try{this.wait();}catch(Exception e){}
                          }else{
                this.name = name;
                this.sex = sex;
                flag = true;
                this.notify();
                                 }
        }
        public synchronized void out()
        {
                if(!flag){
                        try{this.wait();}catch(Exception e){}
                          }else{
                System.out.println(name+"........"+sex);
                flag = false;
                this.notify();
                               }
        }
}

class Input implements Runnable
{
        private Res r ;
        Input(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                int x = 0;
                while(true)
                {
                        if(x==0)                                
                                r.set("mike","man");                                
                        else        
                                r.set("丽丽","女女女女女");                                
                        x = (x+1)%2;
                }
        }
}

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

class  InputOutputDemo2
{
        public static void main(String[] args)
        {
                Res r = new Res();
                new Thread(new Input(r)).start();
                new Thread(new Output(r)).start();               
        }
}

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

3 个回复

倒序浏览
out加else没什么关系,因为取出线程一直在循环调用out方法。
问题出在set方法中的else,设置线程在调用set方法后,要对x进行改变,也就将set里边的内容改变。老师的视频不加else,因为每一次设置好x,就需要将数据利用set方法写入,而第一次set后,x改变,也就是数据要改变,进入set方法发现里边的数据还没取出,设置线程等待,直到取出线程取出后,设置线程活了,然后就直接结束了set方法。
而本应该将数据设置后再退出的,由于要想设置数据必须得else才行,而前一次进来假如没有满足else,当下一次进来时,好!满足了,但是每退出一次set方法,数据就会改变一次,这样,就是楼主结果不同的原因了。。。。。。。
由于用手机,排版和语句方面可哦不是很通顺,希望楼主可以看得明白

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
神之梦 发表于 2013-6-13 08:11
out加else没什么关系,因为取出线程一直在循环调用out方法。
问题出在set方法中的else,设置线程在调用set ...

谢谢你的解答!
回复 使用道具 举报
问题已经解决的,请及时更改分类为已解决,方便大家查阅,没有的继续追问
关于提问技巧请看:http://bbs.itheima.com/thread-53229-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马