阻塞队列
时间:2020-01-09 10:35:50 来源:igfitidea点击:
阻塞队列是一种队列,当我们尝试从队列中出队并且队列为空时,或者尝试将项目入队并且队列已满时,它将阻塞。试图从空队列中出队的线程将被阻止,直到其他线程将一个项目插入队列中为止。尝试使一个项目进入完整队列的线程被阻塞,直到某个其他线程在队列中腾出空间为止,方法是使一个或者多个项目出队或者完全清除队列。
Java 5在java.util.concurrent
包中附带了阻塞队列的实现。了解它们实现背后的理论也会很有用。
阻塞队列的实现
阻塞队列的实现看起来类似于有界信号量。这是阻塞队列的简单实现:
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(); } this.queue.add(item); if(this.queue.size() == 1) { notifyAll(); } } public synchronized Object dequeue() throws InterruptedException{ while(this.queue.size() == 0){ wait(); } if(this.queue.size() == this.limit){ notifyAll(); } return this.queue.remove(0); } }
注意,如果队列大小等于大小限制(0或者限制),则仅从enqueue()和dequeue()调用notifyAll()的方式。如果在调用enqueue()
或者dequeue()
时队列大小不相等,则没有线程等待入队或者出队。