如何创建容量限制的队列实现?

时间:2013-04-08 03:31:05

标签: java concurrency

在Java API文档中,我试图从实现的角度理解以下解释。

http://docs.oracle.com/javase/6/docs/api/java/util/Queue.html

  

除了基本的Collection操作外,队列还提供额外的操作   插入,提取和检查操作。每一个   方法存在两种形式:一种是在操作时抛出异常   失败,另一个返回一个特殊值(null或false,   取决于操作)。后一种形式的插入操作   专门设计用于容量限制的队列   实现;在大多数实现中,插入操作不能   失败。

所以,我想编写一个程序来验证,在哪种情况下它会引发异常。如何创建容量受限的队列实现并验证?

有人可以举例说明吗?

2 个答案:

答案 0 :(得分:1)

您应该使用BlockingQueue,例如ArrayBlockingQueue,即:

  

由数组支持的有界blocking queue。此队列对元素FIFO(先进先出)进行排序。队列的 head 是队列中最长时间的元素。队列的 tail 是队列中最短时间的元素。新元素插入队列的尾部,队列检索操作获取队列头部的元素。

     

这是一个经典的"有界缓冲区",其中固定大小的数组包含由生产者插入并由消费者提取的元素。创建后,无法更改容量。尝试将元素放入完整队列将导致操作阻塞;尝试从空队列中获取元素同样会阻塞。

答案 1 :(得分:0)

ArrayBlockingQueue不是JDK中唯一一个保持其内部容量的队列。接口java.util.concurrent。 BlockingQueue (它是java.util。 Queue 的子接口)的方法是 remainingCapacity ()。所有BlockingQueue实现都必须实现remainingCapacity()。

其中一些实现不希望使用容量限制。他们只返回Integer。 MAX_VALUE 。他们是:

  

java.util.concurrent.ScheduledThreadPoolExecutor.DelayedWorkQueue.remainingCapacity()   java.util.concurrent.DelayQueue.remainingCapacity()
  java.util.concurrent.PriorityBlockingQueue.remainingCapacity()
  java.util.concurrent.LinkedTransferQueue.remainingCapacity()

有一个特殊的,因为它只有0容量:

  

java.util.concurrent.SynchronousQueue.remainingCapacity()

容量限制实施正在使用像容量 - 计数器这样的实现逻辑:

  

java.util.concurrent.ArrayBlockingQueue.remainingCapacity()
  java.util.concurrent.LinkedBlockingQueue.remainingCapacity()
  java.util.concurrent.LinkedBlockingDeque.remainingCapacity()

容量限制队列实施阻止了那些希望将内部计数增加到内部容量之上的方法。