一, CyclicBarrier柵欄簡介
- 柵欄(Barrier)類似閉鎖,他能阻塞一組線程直到某個(gè)事件發(fā)生.柵欄與閉鎖的關(guān)鍵區(qū)別在于,所有線程必須同時(shí)到達(dá)柵欄位置,才能繼續(xù)執(zhí)行. 閉鎖用于等待事件,而柵欄用于等待其他線程.
- 當(dāng)所有線程都到達(dá)了柵欄位置,那么柵欄將打開,此時(shí)所有線程都會被釋放,柵欄可以reset以便于下一次復(fù)用
- 如果await的調(diào)用超時(shí),或者await阻塞的線程被打斷,那么柵欄就被認(rèn)為是打破了,所有阻塞的await調(diào)用都將終止并拋出BrokenBarrierException.如果成功地通過柵欄,那么await將為每個(gè)線程返回一個(gè)唯一的到達(dá)索引號.
- CyclicBarrier 的構(gòu)造函數(shù)public CyclicBarrier(int parties,Runnable barrierAction)可以傳遞一個(gè)Runnable對象,當(dāng)成功通過柵欄時(shí)會被執(zhí)行,且由最后一個(gè)進(jìn)入 barrier 的線程執(zhí)行喷众。
二, CyclicBarrier示例
public class Test {
private static final int N = 10;
public static void main(String[] args) throws InterruptedException {
CyclicBarrier barrier = new CyclicBarrier(N, new Runnable() {
@Override
public void run() {
//所有線程都到達(dá)才會執(zhí)行,且由最后一個(gè)到達(dá)的線程執(zhí)行
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 所有的任務(wù)都已經(jīng)到達(dá)柵欄位置,柵欄打開了 "+System.currentTimeMillis() );
}
});
test(barrier,N);
test(barrier,N);
}
private static void test(CyclicBarrier barrier,int nThread) throws InterruptedException{
for(int i=0; i< nThread-1; i++){
CyclicBarrierThread t = new CyclicBarrierThread(barrier);
t.start();
}
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " 所有子任務(wù)執(zhí)行完畢 "+System.currentTimeMillis());
System.out.println("******************************************");
//重置以便于復(fù)用
barrier.reset();
}
}
class CyclicBarrierThread extends Thread {
CyclicBarrier barrier;
CyclicBarrierThread(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
try {
barrier.await();
System.out.println(Thread.currentThread().getName() + " 執(zhí)行了 "+System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
參考:
<<java編發(fā)編程實(shí)戰(zhàn)>>