|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
java.lang.Object java.util.concurrent.CyclicBarrier
public class CyclicBarrier
一個同步輔助類別,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程序中,這些執行緒必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier 在釋放等待執行緒後可以重用,所以稱它為循環 的 barrier。
CyclicBarrier 支持一個可選的 Runnable
命令,在一組執行緒中的最後一個執行緒到達之後(但在釋放所有執行緒之前),該命令只在每個屏障點運行一次。若在繼續所有參與執行緒之前更新共享狀態,此屏障操作 很有用。
範例用法:下面是一個在並行分解設計中使用 barrier 的例子:
class Solver { final int N; final float[][] data; final CyclicBarrier barrier; class Worker implements Runnable { int myRow; Worker(int row) { myRow = row; } public void run() { while (!done()) { processRow(myRow); try { barrier.await(); } catch (InterruptedException ex) { return; } catch (BrokenBarrierException ex) { return; } } } } public Solver(float[][] matrix) { data = matrix; N = matrix.length; barrier = new CyclicBarrier(N, new Runnable() { public void run() { mergeRows(...); } }); for (int i = 0; i < N; ++i) new Thread(new Worker(i)).start(); waitUntilDone(); } }在這個例子中,每個 worker 執行緒處理矩陣的一行,在處理完所有的行之前,該執行緒將一直在屏障處等待。處理完所有的行之後,將執行所提供的
Runnable
屏障操作,併合並這些行。如果合併者確定已經找到了一個解決方案,那麼 done() 將返回 true,所有的 worker 執行緒都將終止。
如果屏障操作在執行時不依賴於正掛起的執行緒,則執行緒組中的任何執行緒在獲得釋放時都能執行該操作。為方便此操作,每次調用 await()
都將返回能到達屏障處的執行緒的索引。然後,您可以選擇哪個執行緒應該執行屏障操作,例如:
if (barrier.await() == 0) { // log the completion of this iteration }
對於失敗的同步嘗試,CyclicBarrier 使用了一種要麼全部要麼全不 (all-or-none) 的破壞網要:如果因為中斷、失敗或者逾時等原因,導致執行緒過早地離開了屏障點,那麼在該屏障點等待的其他所有執行緒也將通過 BrokenBarrierException
(如果它們幾乎同時被中斷,則用 InterruptedException
)以反常的方式離開。
記憶體一致性效果:執行緒中調用 await()
之前的操作 happen-before 那些是屏障操作的一部份的操作,後者依次 happen-before 緊跟在從另一個執行緒中對應 await()
成功返回的操作。
CountDownLatch
建構子摘要 | |
---|---|
CyclicBarrier(int parties)
創建一個新的 CyclicBarrier,它將在給定數量的參與者(執行緒)處於等待狀態時啟動,但它不會在啟動 barrier 時執行預定義的操作。 |
|
CyclicBarrier(int parties,
Runnable barrierAction)
創建一個新的 CyclicBarrier,它將在給定數量的參與者(執行緒)處於等待狀態時啟動,並在啟動 barrier 時執行給定的屏障操作,該操作由最後一個進入 barrier 的執行緒執行。 |
方法摘要 | |
---|---|
int |
await()
在所有參與者都已經在此 barrier 上調用 await 方法之前,將一直等待。 |
int |
await(long timeout,
TimeUnit unit)
在所有參與者都已經在此屏障上調用 await 方法之前將一直等待,或者超出了指定的等待時間。 |
int |
getNumberWaiting()
返回當前在屏障處等待的參與者數目。 |
int |
getParties()
返回要求啟動此 barrier 的參與者數目。 |
boolean |
isBroken()
查詢此屏障是否處於損壞狀態。 |
void |
reset()
將屏障重置為其初始狀態。 |
從類別 java.lang.Object 繼承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
建構子詳細資訊 |
---|
public CyclicBarrier(int parties, Runnable barrierAction)
parties
- 在啟動 barrier 前必須調用 await()
的執行緒數barrierAction
- 在啟動 barrier 時執行的命令;如果不執行任何操作,則該參數為 null
IllegalArgumentException
- 如果 parties
小於 1public CyclicBarrier(int parties)
parties
- 在啟動 barrier 前必須調用 await()
的執行緒數
IllegalArgumentException
- 如果 parties
小於 1方法詳細資訊 |
---|
public int getParties()
public int await() throws InterruptedException, BrokenBarrierException
如果當前執行緒不是將到達的最後一個執行緒,出於排程目的,將禁用它,且在發生以下情況之一前,該執行緒將一直處於休眠狀態:
reset()
。
如果當前執行緒:
InterruptedException
,並且清除當前執行緒的已中斷狀態。
如果在執行緒處於等待狀態時 barrier 被 reset()
,或者在調用 await 時 barrier 被損壞,抑或任意一個執行緒正處於等待狀態,則拋出 BrokenBarrierException
異常。
如果任何執行緒在等待時被 中斷,則其他所有等待執行緒都將拋出 BrokenBarrierException
異常,並將 barrier 置於損壞狀態。
如果當前執行緒是最後一個將要到達的執行緒,並且建構子中提供了一個非空(null)的屏障操作,則在允許其他執行緒繼續運行之前,當前執行緒將運行該操作。如果在執行屏障操作過程中發生異常,則該異常將傳播到當前執行緒中,並將 barrier 置於損壞狀態。
getParties()
- 1 指示將到達的第一個執行緒,零指示最後一個到達的執行緒
InterruptedException
- 如果當前執行緒在等待時被中斷
BrokenBarrierException
- 如果另一個 執行緒在當前執行緒等待時被中斷或逾時,或者重置了 barrier,或者在調用 await
時 barrier 被損壞,抑或由於異常而導致屏障操作(如果存在)失敗。public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException
如果當前執行緒不是將到達的最後一個執行緒,出於排程目的,將禁用它,且在發生以下情況之一前,該執行緒將一直處於休眠狀態:
reset()
。
如果當前執行緒:
InterruptedException
,並且清除當前執行緒的已中斷狀態。
如果超出指定的等待時間,則拋出 TimeoutException
異常。如果該時間小於等於零,則此方法根本不會等待。
如果在執行緒處於等待狀態時 barrier 被 reset()
,或者在調用 await 時 barrier 被損壞,抑或任意一個執行緒正處於等待狀態,則拋出 BrokenBarrierException
異常。
如果任何執行緒在等待時被中斷,則其他所有等待執行緒都將拋出 BrokenBarrierException
,並將屏障置於損壞狀態。
如果當前執行緒是最後一個將要到達的執行緒,並且建構子中提供了一個非空(null)的屏障操作,則在允許其他執行緒繼續運行之前,當前執行緒將運行該操作。如果在執行屏障操作過程中發生異常,則該異常將傳播到當前執行緒中,並將 barrier 置於損壞狀態。
timeout
- 等待 barrier 的時間unit
- 逾時參數的時間單位
getParties()
- 1 指示第一個將要到達的執行緒,零指示最後一個到達的執行緒
InterruptedException
- 如果當前執行緒在等待時被中斷
TimeoutException
- 如果超出了指定的逾時時間
BrokenBarrierException
- 如果另一個 執行緒在當前執行緒等待時被中斷或逾時,或者重置了 barrier,或者調用 await
時 barrier 被損壞,抑或由於異常而導致屏障操作(如果存在)失敗。public boolean isBroken()
true
;否則返回 false
。public void reset()
BrokenBarrierException
。注意,在由於其他原因造成損壞之後,實行重置可能會變得很複雜;此時需要使用其他方式重新同步執行緒,並選擇其中一個執行緒來執行重置。與為後續使用創建一個新 barrier 相比,這種方法可能更好一些。
public int getNumberWaiting()
await()
中的參與者數目。
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。