阻塞队列是当队列为空并且你想出队时的一种队列,或者你想进入队列,但是队列已经满了。一个线程试图在一个空队列里边出队的话就会阻塞,直到其他的线程进入队列。一个线程试图进入一个满队列的时候它也会阻塞直到队列中的其他线程出队列或者清空队列之后。
下边这个图展现了两个图通过一个队列如何进行合作的。
java5在 java.util.concurrent package包中有阻塞队列的实现,你可以在我的 java.util.concurrent.BlockingQueue指导中学习那个类。即使java5 已经有了阻塞队列的实现,了解实现背后的原理也是很有帮助的。
阻塞队列的实现
阻塞队列的实现看起来很像 Bounded Semaphore,下边是阻塞队列的一个简单的实现。
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);
}
}
注意enqueue和dequeue方法在队列大小等于限制大小的时候(0或者limit)调用notifyAll()。在调用的时候如果没有超过大小的限制,就不会有线程等待入队或者出队。