2016-11-10 28 views
6

场景: 在我的消费者有机会消费任何东西之前,我的生产者将数组填充起来,说容量新的int [10]。我的制作人看到阵列已满并阻塞。ArrayBlockingQueue如何避免混洗数组元素?

然后我的消费者来到并删除int [0],并向生产者发出信号,表示该数组现在有一个空槽要填充。

我的生产者醒来,并试图添加一个新的元素到数组中。考虑到只有int [0]是空闲的,并且我们正在实现FIFO,ArrayBlockingQueue是否将剩余的9个元素全部移到左边,填充0-8个索引并将int [9]留给制作者?

我已经看过了实现,但没有看到任何阵列复制功能,

回答

5

进行数组元素的任何拷贝,因为ArrayBlockingQueue使用数组作为循环缓冲器。它维护两个索引takeIndexputIndex,并在它们到达数组末尾时将其包裹。

,增加或需要它调用一个私有“增量”的方法称为inc的元件,其环绕所述端的索引的操作后:

final int inc(int i) { 
    return (++i == items.length)? 0 : i; 
} 

下面是如何将该方法中使用的示例:

private void insert(E x) { 
    items[putIndex] = x; 
    putIndex = inc(putIndex); // <<== Wraps around 
    ++count; 
    notEmpty.signal(); 
} 
+0

非常聪明。 – TheCoder

0

ArrayBlockingQueue保持两个变量假设frontIndexrearIndex到代替处理移EL的这对此语句。如果队列已满。和任何元件由消费者从索引拉升一个[0]rearIndex移动到索引和下一次每当生产者试图增加任何元件frontIndex将被移动到的索引之后的索引。并且下一个放置操作将在a [0]上完成。

Here FrontIndex == RearIndex表示队列已满。