Java 为什么While循环后的布尔变量仍然为true?

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

我在理解这些方法以及变量empty时遇到问题:

私有字符串消息;
私有布尔值为空=真;
公共同步字符串读取(){
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,以指示新消息可供读取。