5

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

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

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

所以,我想写一个程序来验证,在什么情况下它会抛出异常。如何创建容量受限的队列实现并进行验证?

有人可以举个例子吗?

4

2 回答 2

3

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

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

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

于 2016-05-25T06:11:40.497 回答
1

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

其中一些实现不想使用容量限制。他们只是带着整数返回。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()

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

于 2016-05-25T11:16:55.740 回答