
俗稱隊列,其設計目標是存儲處理前的元素。在Collection基礎上,新增了入隊、出隊、訪問隊首元素的方法:

1)Queue有兩套功能相同的方法:add、remove、element分別為入隊、出隊、訪問隊首元素方法的拋出異常版本;offer、poll、peek則為返回特殊值的版本:
2)offer在有界隊列中常用,當隊列已滿時,元素入隊會返回false而不是拋出異常,因為這一般當作正常情況;
4)Queue一般不自行實現基於元素的equals、hashCode方法,因為在隊列中可能存在多個相等的元素,但是它們的順序是不同的,“順序”在隊列中是很特別的。
俗稱阻塞隊列,支持刪除時一直等到有元素,增加時一直等到隊列有容量空間:

1)其設計主要目標是用作生產者—消費者隊列;
2)BlockingQueue實現類是線程安全的,其方法采用鎖或其他形式並發(如lock-free、wait-free等)實現原子性,對於批量操作addAll、ContainsAll、retainAll、removeAll不一定是原子的,除非特別實現;
3)其存在4種不同版本的操作:

4)BlockingQueue有內部容量限制,可采用remainingCapacity()查看,若無則為Integer.MAX_VALUE;
5)不支持null元素,增加null會拋出NullPointerException,null用於給poll操作檢查是否失敗;
6)內存一致性原則:先於“添加元素到BlockingQeque隊列”的操作happens-before後於“獲取或刪除該元素”的操作;
7)生產者—消費者應用場景,在多個生產者、消費者線程下線程安全:
class Producer implements Runnable {
private final BlockingQueue queue;
Producer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { queue.put(produce()); }
} catch (InterruptedException ex) { ... handle ...}
}
Object produce() { ... }
}
class Consumer implements Runnable {
private final BlockingQueue queue;
Consumer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { consume(queue.take()); }
} catch (InterruptedException ex) { ... handle ...}
}
void consume(Object x) { ... }
}
class Setup {
void main() {
BlockingQueue q = new SomeQueueImplementation();
Producer p = new Producer(q);
Consumer c1 = new Consumer(q);
Consumer c2 = new Consumer(q);
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}
}
俗稱雙端隊列,支持有界容量、無界容量。

Deque不支持List的索引訪問方式;盡管允許null元素,但盡量避免使用,null用做方法的特殊值;一般不定義基於元素的equals、hashCode方法,而采用Object的原生方法。
自有方法:

用作FIFO等效方法:

用作LIFO(Stack)等效方法:

Blocking+Deque:

內存一致性原則:先於“添加元素到BlockingDeque隊列”的操作happens-before後於“獲取或刪除該元素”的操作;
Blocking+Transfer,俗稱傳輸隊列,支持生產者等待消費者獲取元素。
