黑马程序员技术交流社区

标题: 多线程问题,百思不得其解 [打印本页]

作者: muffin    时间: 2015-8-16 17:48
标题: 多线程问题,百思不得其解
class  WaitAndNotify2
{
public static void main(String[] args)
{
  Resource a=new Resource();
  Input in=new Input(a);
  Output ou=new Output(a);
  new Thread(in).start();
  new Thread(ou).start();
}
}
class Resource
{
private String name;
private String sex;
private boolean flag;
public synchronized void setResource(String name,String sex)
{
  if (flag)
  {
   this.name=name;
   this.sex=sex;
   flag=true;
   this.notify();
  }
  else
  {
   try{this.wait();}catch(Exception e){}
  }
}
public synchronized void outResource()
{
  if(flag==true)
  {
   System.out.println(name+"   "+sex);
   flag=false;
   this.notify();
  }
  else
  {
   try{this.wait();}catch(Exception e){}
  }
}
}
class Input implements Runnable
{
private Resource r;
private int x;
Input(Resource r)
{
  this.r=r;
}
public void run()
{
  while (true)
  {
   if (x==0)
    r.setResource("zhangsan","nan");
   else
    r.setResource("lisi","nv");
   x=(x+1)%2;
  }
}
}
class Output implements Runnable
{
private Resource r;
Output(Resource r)
{
  this.r=r;
}
public void run()
{
  while (true)
  {
   r.outResource();
  }
}
}
作者: muffin    时间: 2015-8-16 17:49
和老毕的写法有点不同,但是不明白为啥我这就没法交替打印呢?
感觉问题出在了else那里,但又不知道为啥。
作者: 径直上漠北    时间: 2015-8-16 18:17
else
    r.setResource("lisi","nv");
   x=(x+1)%2;
else后面如果没有{}就只能读下面的一句代码,是不是应该把下面的括起来
也不太懂,姑且试试吧。
作者: 帅帅loyal    时间: 2015-8-16 19:16
你的set方法和get方法中的if判断条件,,,,两个都是真,,
把第一个if语句中的flag改成!flag就行了
作者: boboyuwu    时间: 2015-8-16 20:11
第一个flag为false时候直接wait掉了   第二个out由于flag还为false又wait掉了,全部wait
作者: pengbeilin    时间: 2015-8-16 20:29
- -你这个程序何止不能交替打印,我刚刚试了根本就不能打印啊。
作者: muffin    时间: 2015-8-16 20:31
帅帅loyal 发表于 2015-8-16 19:16
你的set方法和get方法中的if判断条件,,,,两个都是真,,
把第一个if语句中的flag改成!flag就行了 ...

那里是手误。set方法的if条件是,if(flag==false)
作者: muffin    时间: 2015-8-16 20:32
那里是手误。set方法的if条件是,if(flag==false)
作者: muffin    时间: 2015-8-16 20:34
感谢各位,我已经明白咋回事了。。。
今天想了一下午。。。




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