程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> JDK容器與並發—Queue—Interface

JDK容器與並發—Queue—Interface

編輯:JAVA綜合教程

JDK容器與並發—Queue—Interface


框架概覽

\

接口介紹

Queue

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

\

1)Queue有兩套功能相同的方法:add、remove、element分別為入隊、出隊、訪問隊首元素方法的拋出異常版本;offer、poll、peek則為返回特殊值的版本:

 

\ 2)offer在有界隊列中常用,當隊列已滿時,元素入隊會返回false而不是拋出異常,因為這一般當作正常情況;
3)按照元素出入隊順序可分為:FIFO隊列、LIFO隊列、優先級隊列,這三種隊列的一個共同點是:remove、poll返回的元素都是隊首元素:

 

 

\ 4)Queue一般不自行實現基於元素的equals、hashCode方法,因為在隊列中可能存在多個相等的元素,但是它們的順序是不同的,“順序”在隊列中是很特別的。

 

BlockingQueue

俗稱阻塞隊列,支持刪除時一直等到有元素,增加時一直等到隊列有容量空間:

\

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

俗稱雙端隊列,支持有界容量、無界容量。

\

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

自有方法:

\

用作FIFO等效方法:

\

用作LIFO(Stack)等效方法:

\

BlockingDeque

Blocking+Deque

\

內存一致性原則:先於“添加元素到BlockingDeque隊列”的操作happens-before後於“獲取或刪除該元素”的操作;

TransferQueue

Blocking+Transfer,俗稱傳輸隊列,支持生產者等待消費者獲取元素。

\

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved