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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© muffin 中级黑马   /  2015-8-16 17:48  /  345 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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();
  }
}
}

8 个回复

倒序浏览
和老毕的写法有点不同,但是不明白为啥我这就没法交替打印呢?
感觉问题出在了else那里,但又不知道为啥。
回复 使用道具 举报
else
    r.setResource("lisi","nv");
   x=(x+1)%2;
else后面如果没有{}就只能读下面的一句代码,是不是应该把下面的括起来
也不太懂,姑且试试吧。
回复 使用道具 举报
你的set方法和get方法中的if判断条件,,,,两个都是真,,
把第一个if语句中的flag改成!flag就行了
回复 使用道具 举报
第一个flag为false时候直接wait掉了   第二个out由于flag还为false又wait掉了,全部wait
回复 使用道具 举报
- -你这个程序何止不能交替打印,我刚刚试了根本就不能打印啊。
回复 使用道具 举报
muffin 中级黑马 2015-8-16 20:31:27
7#
帅帅loyal 发表于 2015-8-16 19:16
你的set方法和get方法中的if判断条件,,,,两个都是真,,
把第一个if语句中的flag改成!flag就行了 ...

那里是手误。set方法的if条件是,if(flag==false)
回复 使用道具 举报
muffin 中级黑马 2015-8-16 20:32:58
8#
那里是手误。set方法的if条件是,if(flag==false)
回复 使用道具 举报
muffin 中级黑马 2015-8-16 20:34:19
9#
感谢各位,我已经明白咋回事了。。。
今天想了一下午。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马