Java 柵欄 CyclicBarrier 介紹

2021-06-26 13:31:10 字數 1606 閱讀 4405

1、類說明:

乙個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 cyclicbarrier 很有用。因為該 barrier 在釋放等待執行緒後可以重用,所以稱它為迴圈 的 barrier。

2、使用場景:

需要所有的子任務都完成時,才執行主任務,這個時候就可以選擇使用cyclicbarrier。

3、常用方法:

public intawait()

throws interruptedexception,

brokenbarrierexception

在所有參與者都已經在此 barrier 上呼叫 await方法之前,將一直等待。如果當前執行緒不是將到達的最後乙個執行緒,出於排程目的,將禁用它,且在發生以下情況之一前,該執行緒將一直處於休眠狀態:

如果當前執行緒:

則丟擲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的字元...