黑马程序员技术交流社区
标题:
多线程问题,百思不得其解
[打印本页]
作者:
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