java.util.concurrent中文API

idaretobe發表於2015-01-13

JavaTM Platform
Standard Ed. 6

 


軟體包 java.util.concurrent

在併發程式設計中很常用的實用工具類。

 

請參見: 
          描述

 

介面摘要
BlockingDeque<E>

支援兩個附加操作的 Queue,這兩個操作是:獲取元素時等待雙端佇列變為非

空;儲存元素時等待雙端佇列中的空間變得可用。

BlockingQueue<E>

支援兩個附加操作的 Queue,這兩個操作是:獲取元素時等待佇列變為非空,

以及儲存元素時等待空間變得可用。

Callable<V> 返回結果並且可能丟擲異常的任務。
CompletionService<V> 將生產新的非同步任務與使用已完成任務的結果分離開來的服務。
ConcurrentMap<K,V> 提供其他原子 putIfAbsentremovereplace 方法的 Map
ConcurrentNavigableMap<K,V>

支援 NavigableMap 操作,且以遞迴方式支援其可導航子對映的

ConcurrentMap

Delayed 一種混合風格的介面,用來標記那些應該在給定延遲時間之後執行的物件。
Executor 執行已提交的 Runnable 任務的物件。
ExecutorService

Executor 提供了管理終止的方法,以及可為跟蹤一個或多個非同步任務執行狀況

而生成 Future 的方法。

Future<V> Future 表示非同步計算的結果。
RejectedExecutionHandler 無法由 ThreadPoolExecutor 執行的任務的處理程式。
RunnableFuture<V> 作為 Runnable 的 Future
RunnableScheduledFuture<V> 作為 Runnable 的 ScheduledFuture
ScheduledExecutorService 一個 ExecutorService,可安排在給定的延遲後執行或定期執行的命令。
ScheduledFuture<V> 一個延遲的、結果可接受的操作,可將其取消。
ThreadFactory 根據需要建立新執行緒的物件。

 

 

類摘要
AbstractExecutorService 提供 ExecutorService 執行方法的預設實現。
ArrayBlockingQueue<E> 一個由陣列支援的有界阻塞佇列
ConcurrentHashMap<K,V> 支援獲取的完全併發和更新的所期望可調整併發的雜湊表。
ConcurrentLinkedQueue<E> 一個基於連結節點的無界執行緒安全佇列
ConcurrentSkipListMap<K,V> 可縮放的併發 ConcurrentNavigableMap 實現。
ConcurrentSkipListSet<E>

一個基於 ConcurrentSkipListMap 的可縮放併發

NavigableSet 實現。

CopyOnWriteArrayList<E>

ArrayList 的一個執行緒安全的變體,其中所有可變操作(addset

等等)都是通過對底層陣列進行一次新的複製來實現的。

CopyOnWriteArraySet<E> 對其所有操作使用內部 CopyOnWriteArrayList 的 Set
CountDownLatch

一個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允

許一個或多個執行緒一直等待。

CyclicBarrier

一個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障

點 (common barrier point)。

DelayQueue<E extends Delayed>

Delayed 元素的一個無界阻塞佇列,只有在延遲期滿時才能從中提

取元素。

Exchanger<V> 可以在對中對元素進行配對和交換的執行緒的同步點。
ExecutorCompletionService<V> 使用提供的 Executor 來執行任務的 CompletionService
Executors

此包中所定義的 ExecutorExecutorService

ScheduledExecutorServiceThreadFactory 和 Callable

類的工廠和實用方法。

FutureTask<V> 可取消的非同步計算。
LinkedBlockingDeque<E> 一個基於已連結節點的、任選範圍的阻塞雙端佇列
LinkedBlockingQueue<E> 一個基於已連結節點的、範圍任意的 blocking queue
PriorityBlockingQueue<E>

一個無界阻塞佇列,它使用與類 PriorityQueue 相同的順序規

則,並且提供了阻塞獲取操作。

ScheduledThreadPoolExecutor

ThreadPoolExecutor,它可另行安排在給定的延遲後執行命令,

或者定期執行命令。

Semaphore 一個計數訊號量。
SynchronousQueue<E>

一種阻塞佇列,其中每個插入操作必須等待另一個執行緒的對應移除操

作 ,反之亦然。

ThreadPoolExecutor

一個 ExecutorService,它使用可能的幾個池執行緒之一執行每個

提交的任務,通常使用 Executors 工廠方法配置。

ThreadPoolExecutor.AbortPolicy

用於被拒絕任務的處理程式,它將丟擲

RejectedExecutionException.

ThreadPoolExecutor.CallerRunsPolicy

用於被拒絕任務的處理程式,它直接在 execute 方法的呼叫執行緒中

執行被拒絕的任務;如果執行程式已關閉,則會丟棄該任務。

ThreadPoolExecutor.DiscardOldestPolicy

用於被拒絕任務的處理程式,它放棄最舊的未處理請求,然後重試

execute;如果執行程式已關閉,則會丟棄該任務。

ThreadPoolExecutor.DiscardPolicy 用於被拒絕任務的處理程式,預設情況下它將丟棄被拒絕的任務。

 

 

列舉摘要
TimeUnit

TimeUnit 表示給定單元粒度的時間段,它提供在這些單元中進行跨單元轉換和執行計時及延遲操作的

實用工具方法。

 

 

異常摘要
BrokenBarrierException

當某個執行緒試圖等待處於斷開狀態的 barrier 時,或者 barrier 進入斷開狀態而線

程處於等待狀態時,丟擲該異常。

CancellationException

如果某項值生成任務(如 FutureTask)的結果因為任務被取消而無法獲取到,則

丟擲該異常。

ExecutionException 當試圖獲取已通過丟擲異常而中止的任務的結果時,丟擲此異常。
RejectedExecutionException 當無法執行某個任務時,由 Executor 丟擲的異常。
TimeoutException 阻塞操作超時時,丟擲該異常。

 

軟體包 java.util.concurrent 的描述

 

在併發程式設計中很常用的實用工具類。此包包括了幾個小的、已標準化的可擴充套件框架,以及一些提供有用功能的類,沒有這些

類,這些功能會很難實現或實現起來冗長乏味。下面簡要描述主要的元件。另請參閱 locks 和 atomic 包。

執行程式

介面

Executor 是一個簡單的標準化介面,用於定義類似於執行緒的自定義子系統,包括執行緒池、非同步 IO 和輕量級任務框架。根

據所使用的具體 Executor 類的不同,可能在新建立的執行緒中,現有的任務執行執行緒中,或者呼叫 execute() 的執行緒中

執行任務,並且可能順序或併發執行。ExecutorService 提供了多個完整的非同步任務執行框架。ExecutorService 管理

任務的排隊和安排,並允許受控制的關閉。ScheduledExecutorService 子介面及相關的介面新增了對延遲的和定期任

務執行的支援。ExecutorService 提供了安排非同步執行的方法,可執行由 Callable 表示的任何函式,結果類似於

RunnableFuture 返回函式的結果,允許確定執行是否完成,並提供取消執行的方法。RunnableFuture 是擁有run

方法的 Future,run 方法執行時將設定其結果。

 

實現

類 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 提供可調的、靈活的執行緒池。Executors 類提供大多

數 Executor 的常見型別和配置的工廠方法,以及使用它們的幾種實用工具方法。其他基於 Executor 的實用工具包括具

體類 FutureTask,它提供 Future 的常見可擴充套件實現,以及 ExecutorCompletionService,它有助於協調對非同步任

務組的處理。

佇列

java.util.concurrent ConcurrentLinkedQueue 類提供了高效的、可伸縮的、執行緒安全的非阻塞 FIFO 佇列。

java.util.concurrent 中的五個實現都支援擴充套件的 BlockingQueue 介面,該介面定義了 put 和 take 的阻塞版本:

LinkedBlockingQueueArrayBlockingQueueSynchronousQueuePriorityBlockingQueue 和

DelayQueue。這些不同的類覆蓋了生產者-使用者、訊息傳遞、並行任務執行和相關併發設計的大多數常見使用的上下

文。BlockingDeque 介面擴充套件 BlockingQueue,以支援 FIFO 和 LIFO(基於堆疊)操作。LinkedBlockingDeque

類提供一個實現。

計時

TimeUnit 類為指定和控制基於超時的操作提供了多重粒度(包括納秒級)。該包中的大多數類除了包含不確定的等待之

外,還包含基於超時的操作。在使用超時的所有情況中,超時指定了在表明已超時前該方法應該等待的最少時間。在超時發

生後,實現會“盡力”檢測超時。但是,在檢測超時與超時之後再次實際執行執行緒之間可能要經過不確定的時間。接受超時

期引數的所有方法將小於等於 0 的值視為根本不會等待。要“永遠”等待,可以使用 Long.MAX_VALUE 值。

同步器

四個類可協助實現常見的專用同步語句。Semaphore 是一個經典的併發工具。CountDownLatch 是一個極其簡單但又極其

常用的實用工具,用於在保持給定數目的訊號、事件或條件前阻塞執行。CyclicBarrier 是一個可重置的多路同步點,在

某些並行程式設計風格中很有用。Exchanger 允許兩個執行緒在 collection 點交換物件,它在多流水線設計中是有用的。

併發 Collection

除佇列外,此包還提供了設計用於多執行緒上下文中的 Collection 實現:ConcurrentHashMap

ConcurrentSkipListMapConcurrentSkipListSetCopyOnWriteArrayList 和 CopyOnWriteArraySet。當期

望許多執行緒訪問一個給定 collection 時,ConcurrentHashMap 通常優於同步的 HashMapConcurrentSkipListMap

通常優於同步的 TreeMap。當期望的讀數和遍歷遠遠大於列表的更新數時,CopyOnWriteArrayList 優於同步的

ArrayList

 

此包中與某些類一起使用的“Concurrent&rdquo字首;是一種簡寫,表明與類似的“同步”類有所不同。例如,

java.util.Hashtable 和 Collections.synchronizedMap(new HashMap()) 是同步的,但 ConcurrentHashMap

則是“併發的”。併發 collection 是執行緒安全的,但是不受單個排他鎖的管理。在 ConcurrentHashMap 這一特定情況

下,它可以安全地允許進行任意數目的併發讀取,以及數目可調的併發寫入。需要通過單個鎖不允許對 collection 的所有

訪問時,“同步”類是很有用的,其代價是較差的可伸縮性。在期望多個執行緒訪問公共 collection 的其他情況中,通常

“併發”版本要更好一些。當 collection 是未共享的,或者僅保持其他鎖時 collection 是可訪問的情況下,非同步

collection 則要更好一些。

 

大多數併發 Collection 實現(包括大多數 Queue)與常規的 java.util 約定也不同,因為它們的迭代器提供了弱一致的,而不是快速失敗的遍歷。弱一致的迭代器是執行緒安全的,但是在迭代時沒有必要凍結 collection,所以它不一定反映自迭代器建立以來的所有更新。

Java Language Specification 第 17 章定義了記憶體操作(如共享變數的讀寫)的 happen-before 關係。只有寫入操作 happen-before 讀取操作時,才保證一個執行緒寫入的結果對另一個執行緒的讀取是可視的。synchronized 和volatile 構造 happen-before 關係,Thread.start() 和 Thread.join() 方法形成 happen-before 關係。尤其是:

  • 執行緒中的每個操作 happen-before 稍後按程式順序傳入的該執行緒中的每個操作。
  • 一個解除鎖監視器的(synchronized 阻塞或方法退出)happen-before 相同監視器的每個後續鎖(synchronized 阻塞或方法進入)。並且因為 happen-before 關係是可傳遞的,所以解除鎖定之前的執行緒的所有操作 happen-before 鎖定該監視器的任何執行緒後續的所有操作。
  • 寫入 volatile 欄位 happen-before 每個後續讀取相同欄位。volatile 欄位的讀取和寫入與進入和退出監視器具有相似的記憶體一致性效果,但 需要互斥鎖。
  • 線上程上呼叫 start happen-before 已啟動的執行緒中的任何執行緒。
  • 執行緒中的所有操作 happen-before 從該執行緒上的 join 成功返回的任何其他執行緒。

java.util.concurrent 中所有類的方法及其子包擴充套件了這些對更高階別同步的保證。尤其是:

  • 執行緒中將一個物件放入任何併發 collection 之前的操作 happen-before 從另一執行緒中的 collection 訪問或移除該元素的後續操作。
  • 執行緒中向 Executor 提交 Runnable 之前的操作 happen-before 其執行開始。同樣適用於向ExecutorService 提交 Callables
  • 非同步計算(由 Future 表示)所採取的操作 happen-before 通過另一執行緒中 Future.get() 獲取結果後續的操作。
  • “釋放”同步儲存方法(如 Lock.unlockSemaphore.release 和 CountDownLatch.countDown)之前的操作happen-before 另一執行緒中相同同步儲存物件成功“獲取”方法(如Lock.lockSemaphore.acquireCondition.await 和 CountDownLatch.await)的後續操作。
  • 對於通過 Exchanger 成功交換物件的每個執行緒對,每個執行緒中 exchange() 之前的操作 happen-before 另一執行緒中對應 exchange() 後續的操作。
  • 呼叫 CyclicBarrier.await 之前的操作 happen-before 屏障操作所執行的操作,屏障操作所執行的操作happen-before 從另一執行緒中對應 await 成功返回的後續操作。

 

 

從以下版本開始:1.5
JavaTM Platform
Standard Ed. 6

 


 

相關文章