cyclicbarrier 是可迴圈使用的屏障,主要功能是讓一組執行緒到達乙個屏障時被阻塞,直到最後乙個執行緒到達屏障時,屏障才會開啟;所有被屏障攔截的執行緒才會繼續執行。使用示例
public
class
cyclicbarriertest
catch (interruptedexception e) catch (brokenbarrierexception e) }}
@before
public
void
init
() @test
public
void
allawait
() while (true) }}
@test
public
void
oneawaitinterrupted
()throws interruptedexception
if (cyclicbarrier.isbroken()) }}
}複製**
thread-a - 到達屏障前
thread-b - 到達屏障前
屏障中斷退出
thread-a - 等待中斷
thread-b - 屏障被破壞
thread-0 - 到達屏障前
thread-1 - 到達屏障前
thread-2 - 到達屏障前
thread-2 - 到達屏障後
thread-0 - 到達屏障後
thread-1 - 到達屏障後
test over
複製**
從 oneawaitinterrupted 方法執行結果可以看出,當乙個執行緒 a 執行中斷時,另外乙個執行緒 b 會丟擲 brokenbarrierexception
構造
// 可以指定攔截執行緒個數
public
cyclicbarrier
(int parties)
// 指定攔截執行緒個數和所有執行緒到達屏障處後執行的動作
public
cyclicbarrier
(int parties, runnable barrieraction)
複製**
實現
概念
簡單的理解就是,當執行緒都到達屏障的時候,會開啟屏障。await()
await 說明執行緒到達屏障
public
intawait
()throws interruptedexception, brokenbarrierexception catch (timeoutexception toe)
}複製**
private
intdowait
(boolean timed, long nanos)
throws interruptedexception, brokenbarrierexception,
timeoutexception
// 到達屏障的計數減一
int index = --count;
if (index == 0) finally
}// loop until tripped, broken, interrupted, or timed out
for (;;) catch (interruptedexception ie) else
}// 屏障被破壞 則丟擲異常
if (g.broken)
throw
new brokenbarrierexception();
if (g != generation)
// g != generation 說明所有執行緒均到達屏障處 可直接返回
// 因為所有執行緒到達屏障處的時候,會重置 generation
// 參考 nextgeneration
return index;
if (timed && nanos <= 0l)
}} finally
}複製**
private
void
nextgeneration
()複製**
private
void
breakbarrier
()複製**
如下圖為 cyclicbarrier 實現效果圖:
isbroken()
返回屏障是否被破壞,也是是否被中斷
public
boolean
isbroken
() finally
}複製**
reset()public
void
reset
() finally
}複製**
getnumberwaiting獲取阻塞在屏障處的執行緒數
public
intgetnumberwaiting
() finally
}複製**
小結
cyclicbarrier 和 countdownlatch 功能類似,不同之處在於 cyclicbarrier 支援重複利用,而 countdownlatch 計數只能使用一次。
同步屏障CyclicBarrier
cyclicbarrier操作excel public class bankwaterservice implements runnable private void count throws exception 計算當前sheet的銀流資料,計算 省略 sheetbankwatercount.pu...
CyclicBarrier實現原理
cyclicbarrier是乙個同步輔助類,它允許一組執行緒互相等待,直到所有執行緒都到達某個公共屏障點 也可以叫同步點 即相互等待的執行緒都完成呼叫await方法,所有被屏障攔截的執行緒才會繼續執行await方法後面的程式。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時cy...
CyclicBarrier 使用詳解
從字面上的意思可以知道,這個類的中文意思是 迴圈柵欄 大概的意思就是乙個可迴圈利用的屏障。它的作用就是會讓所有執行緒都等待完成後才會繼續下一步行動。舉個例子,就像生活中我們會約朋友們到某個餐廳一起吃飯,有些朋友可能會早到,有些朋友可能會晚到,但是這個餐廳規定必須等到所有人到齊之後才會讓我們進去。這裡...