关于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 (将#修改为@)