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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 盛亚昆 中级黑马   /  2012-3-17 18:34  /  1993 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程,等待唤醒机制中,毕老师说boolean flag默认值是false,那么在同步中if(r.flag)中flag为什么又是ture 了呢

5 个回复

倒序浏览
本帖最后由 张一凡 于 2012-3-17 18:50 编辑

因为那个flag定义的是一个标记,判断这个存储的空间里是否为null,为null就是false,反之就是true。
回复 使用道具 举报

class res
{
        String name;
        String sex;
        boolean flag=false;这个flag 是默认错误
}
classIntput implements Runnable
        private Res r;
       
                Intput(Res r)
        {
                this.r=r;
        synchronized(r)
        {
                int x=0
                while(true)
                {

                if(r.flag)   ;;;;这里怎么是ture
                        wait();
                if (x==0)
               
                {
                        r.name="mike";
                        r.sex="man";
                }
                else
                {
                        r.name="莉莉";
                        r.sex="女";
               
                }
                x=(x+1)%2
                        r.flag=true;
                notify();
       
                }
        }

       
}
classOutput implements Runnable
        {
        private Res r;
       
        Output(Res r)
        {
                this.r=r;
        }
        public void run()
        {
                while(true)
                {
                        synchronized(r)
                        {
                if(!r.flag)
                        wait();
                        System.out.println(r.name+"...."+r.sex);
                        r.flag=false;
                        notify();
                        }
                }
        }
        }
        class  InputOutputDemo

{
public static void main(String[] args)
        {
                Res r=new Res();
                Intput=new Intput(r);
                Output=new Output(r);

                Thread t1=new Thread(in);
                Thread t1=new Thread(out);
                t1.start();
                t2.start();


               
        }

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1 如果写点注释,我感觉会很好,你说呢,亲.

查看全部评分

回复 使用道具 举报
请仔细阅读楼上的代码,毕老师里的是  if(!r.flag)   !的意思是 取反的意思,,false取反就是 true
回复 使用道具 举报
if(!r.flag)   !的意思是 取反的意思,但我说的是当它判断的classIntput implements Runnable
if(r.flag) 里时是ture,就是说当给  boolean flag=false负值为false时,这个标记就是内容不为空,就是ture了,呵呵明白了,谢谢了
回复 使用道具 举报
class res
{
        String name;
        String sex;
        boolean flag=false;  //false为默认值,可不写
}
classIntput implements Runnable
        private Res r;
        
                Intput(Res r)
        {
                this.r=r;
        synchronized(r)
        {
                int x=0
                while(true)
                {

                if(r.flag)      //此处先判断此时flag是false,不运行wait(),向下运行   
                        wait();
                if (x==0)
               
                {
                        r.name="mike";
                        r.sex="man";
                }                        
                else
                {
                        r.name="莉莉";
                        r.sex="女";
               
                }
                x=(x+1)%2      
                r.flag=true;     //输入之后,flag变为true,但仍有执行权,再向上判断此时这就是你的问题为什么if(r.flag) 中flag为true,运行wait(),输入被此时被冻结
                notify();
        
                }
        }

        
}
classOutput implements Runnable
        {
        private Res r;
        
        Output(Res r)
        {
                this.r=r;
        }
        public void run()
        {
                while(true)
                {
                        synchronized(r)
                        {
                if(!r.flag)             //此时flag已被上面变为true,不运行wait()
                        wait();
                        System.out.println(r.name+"...."+r.sex);
                        r.flag=false;   //输出结束后,再把flag值变为false
                        notify();       //唤醒input,再向上判断flag为false,被冻结。input再次获得执行权,如此循环
                        }
                }
        }
        }
        class  InputOutputDemo

{
public static void main(String[] args)
        {
                Res r=new Res();
                Intput=new Intput(r);
                Output=new Output(r);

                Thread t1=new Thread(in);
                Thread t1=new Thread(out);
                t1.start();
                t2.start();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马