2016-11-10 43 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表示隊列已滿。