1、類說明:
乙個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 cyclicbarrier 很有用。因為該 barrier 在釋放等待執行緒後可以重用,所以稱它為迴圈 的 barrier。
2、使用場景:
需要所有的子任務都完成時,才執行主任務,這個時候就可以選擇使用cyclicbarrier。
3、常用方法:
public intawait()在所有參與者都已經在此 barrier 上呼叫 await方法之前,將一直等待。如果當前執行緒不是將到達的最後乙個執行緒,出於排程目的,將禁用它,且在發生以下情況之一前,該執行緒將一直處於休眠狀態:throws interruptedexception,
brokenbarrierexception
如果當前執行緒:
則丟擲interruptedexception
,或者在呼叫 await 時 barrier 被損壞,抑或任意乙個執行緒正處於等待狀態,則丟擲brokenbarrierexception
異常。
如果任何執行緒在等待時被 中斷,則其他所有等待執行緒都將丟擲brokenbarrierexception
異常,並將 barrier 置於損壞狀態。
如果當前執行緒是最後乙個將要到達的執行緒,並且構造方法中提供了乙個非空的屏障操作,則在允許其他執行緒繼續執行之前,當前執行緒將執行該操作。如果在執行屏障操作過程中發生異常,則該異常將傳播到當前執行緒中,並將 barrier 置於損壞狀態。
返回:
到達的當前執行緒的索引,其中,索引getparties()
- 1 指示將到達的第乙個執行緒,零指示最後乙個到達的執行緒
丟擲:
interruptedexception
- 如果當前執行緒在等待時被中斷
brokenbarrierexception
- 如果另乙個 執行緒在當前執行緒等待時被中斷或超時,或者重置了 barrier,或者在呼叫await
時 barrier 被損壞,抑或由於異常而導致屏障操作(如果存在)失敗。
4、相關例項
賽跑時,等待所有人都準備好時,才起跑:
public class cyclicbarriertest
}class runner implements runnable
@override
public void run() catch (interruptedexception e) catch (brokenbarrierexception e)
system.out.println(name + " 起跑!");
}}
結果:
1號選手 準備好了...
2號選手 準備好了...
3號選手 準備好了...
3號選手 起跑!
1號選手 起跑!
2號選手 起跑!
LintCode 柵欄染色
lintcode 柵欄染色 lintcode表述有問題,原文是 必須保證任意兩個相鄰的柱子顏色不同 應該表述為 至多有兩根相鄰的柱子具有相同的顏色 此題使用動態規劃,狀態轉移方程為f i f i 1 k 1 f i 2 k 1 顯然f 0 k,f 1 k k 方法一 class solution p...
514 柵欄染色
3.28 這個題自己的錯誤,廢了很多時間。如果是單純地相鄰不許同色的話,應該就是這樣的 public static int numways1 int n,int k if k 1 n 2 int x int math.pow k 1,n 1 return x k 2 n 1 如果是不允許三根柱子相鄰...
USACO Overfencing 穿越柵欄
農夫john 在外面的田野上搭建了乙個巨大的用柵欄圍成的迷宮。幸運的是,他在迷宮的邊界上留出了兩段柵欄作為迷宮的出口。更幸運的是,他所建造的迷宮是乙個 完美的 迷宮 即你能從迷宮中的任意一點找到一條走出迷宮的路。給定迷宮的寬w 1 w 38 及長h 1 h 100 2 h 1行,每行2 w 1的字元...