问题描述
实例化ArrayBlockingQueue
时,还必须在其构造函数中放入 int容量。同一件事不适用于LinkedBlockingQueue
。我对这为什么感兴趣?
当然,我也可以在LinkedBlockingQueue
中加入绑定,但这是最佳选择。为什么在这里而不是在ArrayBlockingQueue
中是最佳的? ArrayBlockingQueue
不能像ArrayList
那样具有默认的初始容量吗?
解决方法
ArrayBlockingQueue的文档说。
这是经典的“有界缓冲区”,其中固定大小的数组包含生产者插入并由消费者提取的元素。 创建后,容量将无法更改。尝试将元素放入完整队列将导致操作阻塞;尝试从空队列中获取元素的尝试也会类似地被阻止。
由于容量是固定的并且不能更改,因此由类的用户来决定何时应开始阻塞队列。
LinkedBlockQueue的文档说
基于链接节点的可选绑定的阻塞队列。该队列对元素FIFO(先进先出)进行排序。队列的开头是已在队列中停留最长时间的元素。队列的尾部是最短时间位于队列中的元素。新元素插入到队列的尾部,并且队列检索操作在队列的开头获取元素。链接队列通常比基于阵列的队列具有更高的吞吐量,但是在大多数并发应用程序中,可预测的性能却较低。
可选的容量绑定构造函数参数是防止过多队列扩展的一种方式。如果未指定容量,则等于Integer.MAX_VALUE。除非每次插入都会使队列超出容量,否则将在每次插入时动态创建链接节点。
在这种情况下,基于提供的容量进行阻止。如果指定,则与ArrayBlockingQueue