Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 阻塞队列-为什么没有通知()_Java_Multithreading_Client Server_Producer Consumer - Fatal编程技术网

Java 阻塞队列-为什么没有通知()

Java 阻塞队列-为什么没有通知(),java,multithreading,client-server,producer-consumer,Java,Multithreading,Client Server,Producer Consumer,我正在网上浏览这个边界队列代码,试图理解它 public class BlockingQueue { private List queue = new LinkedList(); private int limit = 10; public BlockingQueue(int limit){ this.limit = limit; } public synchronized void enqueue(Object item) throws Interru

我正在网上浏览这个边界队列代码,试图理解它

public class BlockingQueue {

  private List queue = new LinkedList();
  private int  limit = 10;

  public BlockingQueue(int limit){
    this.limit = limit;
  }


  public synchronized void enqueue(Object item)
  throws InterruptedException  {
    while(this.queue.size() == this.limit) {
      wait();
    }
    if(this.queue.size() == 0) {
      notifyAll();
    }
    this.queue.add(item);
  }


  public synchronized Object dequeue()
  throws InterruptedException{
    while(this.queue.size() == 0){
      wait();
    }
    if(this.queue.size() == this.limit){
      notifyAll();
    }

    return this.queue.remove(0);
  }

}
我的理解是:

  • 如果队列中没有更多的项目,则无法将任何内容移出队列,因此我们称之为wait()
  • 如果队列中有最大数量的项目,则任何项目都无法排队,因此我们称之为wait()
  • 如果队列中有一些空间(和一些元素),我们可以调用enqueue和dequeue
  • 我们还要通知所有人(),让所有的生产者和消费者都清醒过来

  • 但是我们调用wait()的请求会发生什么情况呢。他们是否只在notifyAll()调用时收到通知?为什么不在队列中有空间时立即通知他们?

    您只需要在添加到空队列时通知,因为出列者只在空队列上等待


    类似地,您只需要在从完整队列中排队时发出通知,因为排队者只在完整队列中等待。

    了解代码需要注意的两个细节:

  • 线程还必须在唤醒前获取锁,这就是为什么两个
    notifyAll
    可以放置在最后一行以外的位置
  • 除了等待,还有排队。当没有线程在等待它的状态时,所有线程都在排队获取锁,这就是为什么当队列达到满或空时,代码只执行
    notifyAll

  • 只是我在这里只能看到notifyAll(),而不能看到notify。他们是如何得到通知的?您认为
    notifyAll
    有什么作用?notifyAll()只在没有更多元素时在队列中被调用,而在有最大元素时在队列中被调用。我的问题正是这样。为什么要等待这些限制?为什么不尽快通知呢?
    notifyAll
    如果队列大小达到限制,也会在
    dequeue
    上被调用。哦,我想现在开始有意义了。谢谢