J**a 线程通信

时间:2013.08.01 发布人:tcyk1314

J**a 线程通信

已解决问题

谷歌tcyk1314用户在2013.08.01提交了关于“三峡大坝J**a 线程通信”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2024-11-05T21:18:52。classPro**cerimplementsRunnable
{
Qq=**ll;
publicPro**cer(Qq)
{
this.q=q;
}
publicvoidrun()
{
inti=0;
while(true)
{
if(i==0)
{
q.put("张品","女");
}
else
{
q.put("郑爽","男");
}
i=(i+1)%2;
}
}
}

classConsumerimplementsRunnable
{
Qq=**ll;
publicConsumer(Qq)
{
this.q=q;
}
publicvoidrun()
{
while(true)
{
q.get();
}

}
}
classCommunication
{
publicstaticvoidmain(String[]args)
{
Qq=newQ();
newThread(newPro**cer(q)).start();

newThread(newConsumer(q)).start();
}
}





classQ
{
privateStringname;
privateString**;
privatebooleanbFull=false;
publicsynchronizedvoidput(Stringname,String**)
{
if(bFull)
{
try{this.wait();}catch(Exceptione){}
}
else
{
***.name=name;
***.**=**;
bFull=true;
this.notify();
}


}
publicsynchronizedvoidget()
{
if(bFull)
{
System.out.println(name+""+**);
bFull=false;
this.notify();
}
else
{
try{this.wait();}catch(Exceptione){}
}

}

}


为什么结果不是"张品","女"和"郑爽","男"这样循环出现的,而是一样出现几个,为什么没有实现线程间的通信?
还有如果我把put方法的else去掉又可以了,这是为什么?
谢谢希望大家能够帮助她。

详细问题描述及疑问:classPro**cerimplementsRunnable
{
Qq=**ll;
publicPro**cer(Qq)
{
this.q=q;
}
publicvoidrun()
{
inti=0;
while(true)
{
if(i==0)
{
q.put("张品","女");
}
else
{
q.put("郑爽","男");
}
i=(i+1)%2;
}
}
}

classConsumerimplementsRunnable
{
Qq=**ll;
publicConsumer(Qq)
{
this.q=q;
}
publicvoidrun()
{
while(true)
{
q.get();
}

}
}
classCommunication
{
publicstaticvoidmain(String[]args)
{
Qq=newQ();
newThread(newPro**cer(q)).start();

newThread(newConsumer(q)).start();
}
}





classQ
{
privateStringname;
privateString**;
privatebooleanbFull=false;
publicsynchronizedvoidput(Stringname,String**)
{
if(bFull)
{
try{this.wait();}catch(Exceptione){}
}
else
{
***.name=name;
***.**=**;
bFull=true;
this.notify();
}


}
publicsynchronizedvoidget()
{
if(bFull)
{
System.out.println(name+""+**);
bFull=false;
this.notify();
}
else
{
try{this.wait();}catch(Exceptione){}
}

}

}


为什么结果不是"张品","女"和"郑爽","男"这样循环出现的,而是一样出现几个,为什么没有实现线程间的通信?
还有如果我把put方法的else去掉又可以了,这是为什么?
谢谢期待您的答案,当代劳模,所有人都应该向你学习 !

希望以下的回答,能够帮助你。

第1个回答

用户名:ajoywy  

因为一般来讲,wait-notify这种模式不是这样用的,而是:
while(condition==false){
try{
obj.wait();
}ca红须画功tch(InterruptedExceptione){}
}
祷个wait状态的线程被notify后,你醒来的位置正是之前他睡觉去的地方。也就是说你的Pro**cer在put中的来自if块中睡觉去了,后来还会在if块中问答醒来,是不会去到else块中去的,所以那一次的put就失败了,传过去的参数就有等于丢了。所以会出现重复性别。也可以解释你把else去掉就可以了

上面这种写法的意思,祷个线程被唤醒时,需要重新检测汉料钟看盟你条件是否已经满足,因为在许多实际情况中,计困讨式体房响纸沙有多于2个的线程,而一个县氢岩送旧景帮去断既王线程很可能调用了notifyAll()从而使得执找行条件还没被满足的线程也被唤醒了。这时候那个被守始黄食离斤亲唤醒的线程如果检测到条件不满足,就重新睡觉去,反之则执行下去。

所以在你的问题当中,联作率苏染攻紧电我不能让醒来的线程就此退出整个方法,当然写成while那样是可以的,不过你这里似乎没有这个必要,所以直接把else去掉也可以成功。