JavaTM 2 Platform
Standard Ed. 6

軟體套件 java.util.concurrent

在共時程式中很常用的實用工具類別。

請參見:
          描述

介面摘要
BlockingDeque<E> 支持兩個附加操作的 Queue,這兩個操作是:獲取元素時等待雙端佇列變為非空(null);存儲元素時等待雙端佇列中的空間變得可用。
BlockingQueue<E> 支持兩個附加操作的 Queue,這兩個操作是:獲取元素時等待佇列變為非空(null),以及存儲元素時等待空間變得可用。
Callable<V> 返回結果並且可能拋出異常的任務。
CompletionService<V> 將生產新的非同步任務與使用已完成任務的結果分離開來的服務。
ConcurrentMap<K,V> 提供其他原子 putIfAbsent、remove、replace 方法的 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 的一個執行緒安全的變體,其中所有可變操作(add、set 等等)都是通過對底層陣列進行一次新的複製來實作的。
CopyOnWriteArraySet<E> 對其所有操作使用內部 CopyOnWriteArrayList 的 Set。
CountDownLatch 一個同步輔助類別,在完成一組正在其他執行緒中執行的操作之前,它允許一個或多個執行緒一直等待。
CyclicBarrier 一個同步輔助類別,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。
DelayQueue<E extends Delayed> Delayed 元素的一個無界阻塞佇列,只有在延遲期滿時才能從中提取元素。
Exchanger<V> 可以在對中對元素進行配對和交換的執行緒的同步點。
ExecutorCompletionService<V> 使用提供的 Executor 來執行任務的 CompletionService。
Executors 此套件中所定義的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 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 表示的任何函數,結果類似於 Runnable。Future 返回函數的結果,允許確定執行是否完成,並提供取消執行的方法。RunnableFuture 是擁有 run 方法的 Future,run 方法執行時將設置其結果。

實作。類別 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 提供可調的、靈活的執行緒池。Executors 類別提供大多數 Executor 的常見型別和配置的處理器方法,以及使用它們的幾種實用工具方法。其他基於 Executor 的實用工具套件括具體類別 FutureTask,它提供 Future 的常見可擴展實作,以及 ExecutorCompletionService,它有助於協調對非同步任務組的處理。

佇列

java.util.concurrent ConcurrentLinkedQueue 類別提供了高效的、可伸縮的、執行緒安全的非阻塞 FIFO 佇列。java.util.concurrent 中的五個實作都支持擴展的 BlockingQueue 介面,該介面定義了 put 和 take 的阻塞版本:LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue 和 DelayQueue。這些不同的類別覆寫了生產者-使用者、訊息傳遞、並行任務執行和相關共時設計的大多數常見使用的上下文。BlockingDeque 介面擴展 BlockingQueue,以支持 FIFO 和 LIFO(基於堆疊(stack)空間)操作。LinkedBlockingDeque 類別提供一個實作。

計時

TimeUnit 類別為指定和控制基於逾時的操作提供了多重粒度(包括納秒級)。該套件中的大多數類別除了包含不確定的等待之外,還包含基於逾時的操作。在使用逾時的所有情況中,逾時指定了在表明已逾時前該方法應該等待的最少時間。在逾時發生後,實作會“盡力”檢測逾時。但是,在檢測逾時與逾時之後再次實際執行執行緒之間可能要經過不確定的時間。接受逾時期參數的所有方法將小於等於 0 的值視為根本不會等待。要「永遠」等待,可以使用 Long.MAX_VALUE 值。

同步器

四個類別可協助實作常見的專用同步語句。Semaphore 是一個經典的共時工具。CountDownLatch 是一個極其簡單但又極其常用的實用工具,用於在保持給定數目的信號、事件或條件前阻塞執行。CyclicBarrier 是一個可重置的多路同步點,在某些並行程式樣式中很有用。Exchanger 允許兩個執行緒在 collection 點交換物件,它在多串流水線設計中是有用的。

共時 Collection

除佇列外,此套件還提供了設計用於多執行緒上下文中的 Collection 實作:ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList 和 CopyOnWriteArraySet。當期望許多執行緒存取一個給定 collection 時,ConcurrentHashMap 通常優於同步的 HashMap,ConcurrentSkipListMap 通常優於同步的 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 關係。尤其是: java.util.concurrent 中全部類別的方法及其子包擴展了這些對更高層級別同步的保證。尤其是:

從以下版本開始:
1.5

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。