阻塞队列

时间: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()时队列大小不相等,则没有线程等待入队或者出队。