|
JavaTM Platform Standard Ed. 6 |
上一個軟體包 下一個軟體包 |
軟體包 java.util.concurrent
在並發編程中很常用的工具 + 生產力類。
請參見:
描述
介面摘要
BlockingDeque<E> |
支援兩個附加操作的
Queue ,這兩個操作是:擷取元素時等待雙端隊列變為非 空;儲存元素時等待雙端隊列中的空間變得可用。 |
BlockingQueue<E> |
支援兩個附加操作的
Queue ,這兩個操作是:擷取元素時等待隊列變為非空, 以及儲存元素時等待空間變得可用。 |
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 Factory 方法配置。 |
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 的常見類型和配置的Factory 方法,以及使用它們的幾種工具 + 生產力方法。其他基於 Executor 的工具 + 生產力包括具
體類
FutureTask
,它提供 Future 的常見可擴充實現,以及
ExecutorCompletionService
,它有助於協調對非同步任
務組的處理。
隊列java.util.concurrent
ConcurrentLinkedQueue
類提供了高效的、可伸縮的、安全執行緒的非阻塞 FIFO 隊列。
java.util.concurrent 中的五個實現都支援擴充的
BlockingQueue
介面,該介面定義了 put 和 take 的阻塞版本:
LinkedBlockingQueue
、ArrayBlockingQueue
、SynchronousQueue
、PriorityBlockingQueue
和
DelayQueue
。這些不同的類覆蓋了生產者-使用者、訊息傳遞、並行任務執行和相關並發設計的大多數常見使用的上下
文。BlockingDeque
介面擴充
BlockingQueue,以支援 FIFO 和 LIFO(基於堆棧)操作。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 關係。尤其是:
- 線程中的每個操作 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.unlock
、Semaphore.release
和
CountDownLatch.countDown
)之前的操作 happen-before 另一線程中相同同步儲存對象成功“擷取”方法(如
Lock.lock
、Semaphore.acquire
、Condition.await
和
CountDownLatch.await
)的後續操作。
- 對於通過
Exchanger
成功交換對象的每個線程對,每個線程中 exchange()
之前的操作
happen-before 另一線程中對應 exchange()
後續的操作。
- 調用
CyclicBarrier.await
之前的操作 happen-before 屏障操作所執行的操作,屏障操作所執行的操作
happen-before 從另一線程中對應 await
成功返回的後續操作。
從以下版本開始:
1.5
|
JavaTM Platform Standard Ed. 6 |
上一個軟體包 下一個軟體包 |