我正在线上尝试理解这个边界队列代码
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()电话的通知吗?为什么一旦队列中有空间就不会得到通知?
答案 0 :(得分:3)
添加到空队列时只需要通知,因为dequeuers只等待空队列。
类似地,您只需要在从完整队列出队时通知,因为入队者只在等待完整队列。
答案 1 :(得分:0)
要了解代码,请注意两个细节:
notifyAll
可以放在最后一行以外的地方。notifyAll
的原因。