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()的请求会发生什么情况呢。他们是否只在notifyAll()调用时收到通知?为什么不在队列中有空间时立即通知他们?您只需要在添加到空队列时通知,因为出列者只在空队列上等待
类似地,您只需要在从完整队列中排队时发出通知,因为排队者只在完整队列中等待。了解代码需要注意的两个细节:
notifyAll
可以放置在最后一行以外的位置notifyAll
只是我在这里只能看到notifyAll(),而不能看到notify。他们是如何得到通知的?您认为
notifyAll
有什么作用?notifyAll()只在没有更多元素时在队列中被调用,而在有最大元素时在队列中被调用。我的问题正是这样。为什么要等待这些限制?为什么不尽快通知呢?notifyAll
如果队列大小达到限制,也会在dequeue
上被调用。哦,我想现在开始有意义了。谢谢