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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 不喝茶的陆羽 于 2013-5-10 15:41 编辑

while(flag)
                        try{this.wait();}catch(Exception e){}//t1(放弃资格)  t2(获取资格)
                this.name = name+"--"+count++;

                System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
                flag = true;
                this.notifyAll();
        }


        //  t3   t4  
        public synchronized void out()
        {
                while(!flag)
                        try{wait();}catch(Exception e){}//t3(放弃资格) t4(放弃资格)
                System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
                flag = false;
                this.notifyAll();
        }
老师说这里if不行,会产生一次判断后等待线程唤醒后未经判断就执行了的问题,换成while就会在每次唤醒后都判断。不理解,都已经进入while内的代码唤醒后还会判断吗?求问while工作逻辑。

8 个回复

倒序浏览
本帖最后由 zms2100 于 2013-5-10 15:31 编辑

那句话可以看成这样:
while(!flag)
{
    try{wait();}catch(Exception e){}
}
这样就懂了吧,因为只有一句,所以加不加那两个大括号都行。
回复 使用道具 举报
本帖最后由 不喝茶的陆羽 于 2013-5-10 15:40 编辑
zms2100 发表于 2013-5-10 15:30
那句话可以看成这样:
while(!flag)
{

额,我糊涂了,明白了,这个while本就不是为了造成代码循环,而是为了循环判断,所以只有wait那一句代码...
原来if时还明白的,结果换了while我就糊涂了,谢谢~
回复 使用道具 举报
不懂帮顶!
回复 使用道具 举报
Jacky_Chen1990 发表于 2013-5-10 15:36
不懂帮顶!

怎么你总是刚好比我多一分了,................
回复 使用道具 举报
zms2100 发表于 2013-5-10 16:03
怎么你总是刚好比我多一分了,................

等你加了3分,社区达人,就超过我了。。。:shutup:
回复 使用道具 举报
Jacky_Chen1990 发表于 2013-5-10 16:25
等你加了3分,社区达人,就超过我了。。。

你之前加了的啊,O(∩_∩)O~,不过最近会上的少了,难说了,呵呵,专心学习基础,感觉怕会赶不上进度,(⊙o⊙)….........
回复 使用道具 举报
zms2100 发表于 2013-5-10 16:36
你之前加了的啊,O(∩_∩)O~,不过最近会上的少了,难说了,呵呵,专心学习基础,感觉怕会赶不上进度,( ...

恩啦~~我最近也不回答问题啥的 基本就是不懂帮顶。。。~~加油!20期期待你!
回复 使用道具 举报
Jacky_Chen1990 发表于 2013-5-10 16:39
恩啦~~我最近也不回答问题啥的 基本就是不懂帮顶。。。~~加油!20期期待你! ...

好吧,我的早期计划是20期,但是6月那会太多事要处理结尾,所以是准备进21期的,那你要加油~\(≧▽≦)/~啦啦啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马