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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 攻城狮 黑马帝   /  2012-3-18 14:45  /  2635 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李南江 于 2012-3-18 15:00 编辑

class Res
{
        private String name;
        private String sex;
        private boolean flag = false;//这里定义flag是false
        public synchronized void set(String name,String sex)
        {
                if(flag)//这里的flag判断不就是假么?那补是直接就waitl了?求解??
                        try{this.wait();}catch(Exception e){}
                this.name = name;
               
                this.sex = sex;
                flag = true;
                this.notify();
        }
        public synchronized void out()
        {
                if(!flag)
                        try{this.wait();}catch(Exception e){}
                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();
        }
}


4 个回复

倒序浏览
if(r.flag)//弄不清楚这里 上面定义的是假 那么这里应该是假啊 那不是进来就wait了?
                                         try{r.wait();}catch(Exception e){}

if(条件){ 如果条件为真才执行这里面的语句    }

if(r.flag)
      {   try{r.wait();}catch(Exception e){}    }
你那个语句就等于上面这个,r.flag为false ,就跳过try的语句了啊
所以第一线程进入这里面来,先要
{    //因为x==0
     r.name="mike";
     r.sex="man";
}

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
李晓旭 发表于 2012-3-18 15:03
if(条件){ 如果条件为真才执行这里面的语句    }

if(r.flag)

了解了 谢谢··
回复 使用道具 举报
少括号了 无论if执不执行都wait() 把你if要执行的语句括起来。
回复 使用道具 举报
魏群 发表于 2012-3-18 15:32
少括号了 无论if执不执行都wait() 把你if要执行的语句括起来。

省略括号 if 可以管理离它最近的那一条语句哦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马