黑马程序员技术交流社区

标题: 求助wiat问题 [打印本页]

作者: 攻城狮    时间: 2012-3-18 14:45
标题: 求助wiat问题
本帖最后由 李南江 于 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();
        }
}



作者: 李晓旭    时间: 2012-3-18 15:03
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";
}


作者: 攻城狮    时间: 2012-3-18 15:05
李晓旭 发表于 2012-3-18 15:03
if(条件){ 如果条件为真才执行这里面的语句    }

if(r.flag)

了解了 谢谢··
作者: 魏群    时间: 2012-3-18 15:32
少括号了 无论if执不执行都wait() 把你if要执行的语句括起来。
作者: 攻城狮    时间: 2012-3-18 17:03
魏群 发表于 2012-3-18 15:32
少括号了 无论if执不执行都wait() 把你if要执行的语句括起来。

省略括号 if 可以管理离它最近的那一条语句哦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2