关于Java的LinkedBlockingQueue的问题

2025-03-20 02:03:57
推荐回答(1个)
回答1:

Producer 中只有一个 Product 实例 p,所以加到 Global.list 中的 p 是同一个对象,有可能 Producer
在连续的几个 i ,设置 p 的 name 和 date,加入 Global.list,但 p 是同一个对象,所以 name 和 date 都是最后一个 i 的值,然后 Consumer 从 Global.list 中取数据,取到的是同一个 p 对象,打印出的 name 和date 相同的几条记录。

正确的方法应该是 Producer 中每次往 Global.list 中添加不同的 Product 实例。

class Product {
  private String name;
  private String date;

  public Product() {
    super();
  }

  public Product(String name, String date) {
    super();
    this.name = name;
    this.date = date;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getDate() {
    return date;
  }

  public void setDate(String date) {
    this.date = date;
  }
}

class Producer implements Runnable {

  @Override
  public void run() {
    for (int i = 0; i < 5; ++i) {
      try {
        // System.out.println("begin to put: " + i);
        Global.list.put(new Product("Name:" + i, "Date" + i));
        // System.out.println("end to put: " + i);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}