Java 为什么While循环后的布尔变量仍然为true?
我在理解这些方法以及变量empty时遇到问题:Java 为什么While循环后的布尔变量仍然为true?,java,multithreading,concurrency,wait,notify,Java,Multithreading,Concurrency,Wait,Notify,我在理解这些方法以及变量empty时遇到问题: 私有字符串消息; 私有布尔值为空=真; 公共同步字符串读取(){ while(空){ 试一试{ 等待(); }捕获(中断异常e){} } empty=true;//我是说这行 notifyAll(); 返回消息; } 公共同步无效写入(字符串消息){ 而(!空){ 试一试{ 等待(); }捕获(中断异常e){} } empty=false;//这一行 this.message=消息; notifyAll(); } 首先,我无法理解wait()和n
私有字符串消息;
私有布尔值为空=真;
公共同步字符串读取(){
while(空){
试一试{
等待();
}捕获(中断异常e){}
}
empty=true;//我是说这行
notifyAll();
返回消息;
}
公共同步无效写入(字符串消息){
而(!空){
试一试{
等待();
}捕获(中断异常e){}
}
empty=false;//这一行
this.message=消息;
notifyAll();
}
首先,我无法理解wait()和notifyAll()那么,其次,为什么在read()中的while循环之后,空是真的,为什么不是假的?
与write()相同while循环后为什么不为true
对不起,如果我的语言不好,我不是以英语为母语的人。
提前感谢它的顺序有点奇怪-例如,我会在修改“message”之后修改“empty”,这对我来说似乎更明显-但是 这是一个单消息缓冲区 “write”方法等待“empty”,此时可以将消息设置为“message”,使其不为空 “read”方法等待“notempty”,在该点它可以使用“message”中的消息,使其再次为空
就我的口味而言,变量“empty”是多余的。我将它建立在“message”的null/non-null状态上(假设从来没有将null写为消息的情况)。
read
调用wait
,只要empty
为真:意味着没有什么可读的内容。一旦empty
为false,read
将empty
设置为true(意味着它读取任何要读取的内容),通知所有等待的线程并返回
write
的作用正好相反。想象一下如果empty
被重命名为messageconsumered
。这是否使它更清晰?@VGR还没有,为什么在while循环块之后,write()中仍然是真的?因为write
方法必须等待消息被读取。读取后,布尔字段设置为false,以指示新消息可供读取。