如何解决关于Java生产者-消费者场景的问题
我知道类似的问题已经被问过很多次了,但我花了一些时间阅读类似的问题却找不到合适的答案。
代码如下:
public class Main {
public static void main(String[] args) {
Message message = new Message();
(new Thread(new Writer(message))).start();
(new Thread(new Reader(message))).start();
}
}
class Message {
private String message;
private boolean empty = true;
public synchronized String read() {
while(empty) {
try {
System.out.println("Reader is waiting...relinquish the lock");
wait();
} catch(InterruptedException e) {
}
}
empty = true;
notifyAll();
return message;
}
public synchronized void write(String message) {
while(!empty) {
try {
System.out.println("Writer is waiting...relinquish the lock");
wait();
} catch(InterupptedException e) {
}
}
empty = false;
this.message = message;
notifyAll();
}
}
class Writer implements Runnable {
private Message message;
public Writer(Message message) {
this.message = message;
}
public void run() {
String messages[] = {
// some message here
};
for(int i=0; i < messages.length; i++) {
message.write(messages[i]);
}
message.write("Finished");
}
}
class Reader implements Runnable {
private Message message;
public Reader(Message message) {
this.message = message;
}
public void run() {
for(String msg = message.read(); !msg.equals("Finished"); msg = message.read()) {
System.out.println(msg);
}
}
我的理解是,在 Reader 线程的 for 循环中返回单个 read() 方法后,标志 empty 变为 true,Writer 线程被 notifyAll() 唤醒并准备好安排运行,但 Reader尚未释放对 Message 对象的锁定,这意味着 Writer 无法调用同步的 write() 方法,因为它仍然处于阻塞状态。然后Reader线程再次调用read(),进入while循环,打印出“Reader is waiting...”消息,然后调用wait()释放锁,以便Writer线程继续获取锁,调用 write() 方法。
但是从控制台中显示的输出消息来看,很多时候“阅读器正在等待...”消息根本没有打印出来,只有几次打印出来。从上面的推理来看,这个消息不应该在每次运行程序时打印出来吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。