阻塞队列

什么是阻塞队列?

看图:

阻塞队列_第1张图片
Paste_Image.png

首先:它是一个接口
其次:看文档吧

A Queue that additionally supports operations that wait for the queue to become non-empty when retrieving an element, and wait for space to become available in the queue when storing an element.

这个队列有以下特色:

  1. 当取一个元素的时候,若是队列一直为空,则线程等待,直到队列不为空。
  2. 当存储一个元素的时候,若队列满了,则线程等待,直到丢列有多余的空间。

阻塞队列中的方法

阻塞队列_第2张图片
Paste_Image.png

几个注意点

  1. 阻塞队列不接收 null 元素,存储 null 元素时会 抛出异常。
  2. 阻塞队列可以有容量限制。通过方法:remainingCapacity 可提供剩余容量大小,无限制则为Integer.MAX_VALUE。
  3. 阻塞队列的一些实现,主要是为了生产者与消费者队列而设计的。但也额外的提供了对集合的操作,比如:移除队列中的任意元素 remove(x)。
  4. 阻塞队列的一些实现都是线程安全的。比如入队操作,都是原子级的,满足了线程的并发控制。

生产者,消费者例子

  1. 生产者
class Producer implements Runnable {
   private final BlockingQueue queue;
   Producer(BlockingQueue q) { queue = q; 
   public void run() {
     try {
       while (true) { queue.put(produce()); }
     } catch (InterruptedException ex) { ... handle ...}
   }
   Object produce() { ... }
 }
  1. 消费者
class Consumer implements Runnable {
   private final BlockingQueue queue;
   Consumer(BlockingQueue q) { queue = q; }
   public void run() {
     try {
       while (true) { consume(queue.take()); }
     } catch (InterruptedException ex) { ... handle ...}
   }
   void consume(Object x) { ... }
 }
  1. go
 class Setup {
   void main() {
     BlockingQueue q = new SomeQueueImplementation();
     Producer p = new Producer(q);
     Consumer c1 = new Consumer(q);
     Consumer c2 = new Consumer(q);
     new Thread(p).start();
     new Thread(c1).start();
     new Thread(c2).start();
   }
 }}

阻塞队列的几个具体实现

  1. ArrayBlockQueue:一个由数组支持的有界阻塞队列。此队列按** FIFO(先进先出)原则**对元素进行排序。创建其对象必须明确大小,像数组一样。

  2. LinkedBlockQueue:一个可改变大小的阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。创建其对象如果没有明确大小,默认值是Integer.MAX_VALUE。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。

  3. PriorityBlockingQueue:类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序。

  4. SynchronousQueue:同步队列。同步队列没有任何容量,每个插入必须等待另一个线程移除,反之亦然。

福利时间

阻塞队列_第3张图片
看累了,休息下吧

你可能感兴趣的:(阻塞队列)