微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于Java生产者-消费者场景的问题

如何解决关于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 举报,一经查实,本站将立刻删除。