俗稱隊列,其設計目標是存儲處理前的元素。在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,俗稱傳輸隊列,支持生產者等待消費者獲取元素。