柵欄屏障,讓一組線程到達(dá)一個屏障(也可以叫同步點)時被阻塞,直到最后一個線程 到達(dá)屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續(xù)運行。 CyclicBarrier默認(rèn)的構(gòu)造方法是CyclicBarrier(int parties),其參數(shù)表示屏障攔截的線 程數(shù)量,每個線程調(diào)用await方法告CyclicBarrier我已經(jīng)到達(dá)了屏障,然后當(dāng)前線程被阻塞
方法:
cyclicBarrier.await()
應(yīng)用場景:
可以用于多線程計算數(shù)據(jù),最后合并計算結(jié)果的場景。例如,用一個Excel保存了用戶 所有銀行流水,每個Sheet保存一個賬戶近一年的每筆銀行流水,現(xiàn)在需要統(tǒng)計用戶的日均 銀行流水,先用多線程處理每個sheet里的銀行流水,都執(zhí)行完之后,得到每個sheet的日均銀行流水,最后,再用barrierAction用這些線程的計算結(jié)果,計算出整個Excel的日 均銀行流水
示例代碼:
/**
* @author qy
* @date 2019/8/23 14:46
* @description
*/
public class CyclicBarrierTest implements Runnable {
private CyclicBarrier cyclicBarrier;
private int index;
public CyclicBarrierTest(CyclicBarrier cyclicBarrier, int index) {
this.cyclicBarrier = cyclicBarrier;
this.index = index;
}
public void run() {
try {
System.out.println("index:" + index);
index--;
cyclicBarrier.await();
} catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
CyclicBarrier cyclicBarrier = new CyclicBarrier(11, new Runnable() {
public void run() {
System.out.println("所有特工到達(dá)屏障,準(zhǔn)備開始執(zhí)行秘密任務(wù)");
}
});
for (int i = 0; i < 10; i++) {
new Thread(new CyclicBarrierTest(cyclicBarrier, i)).start();
}
cyclicBarrier.await();
System.out.println("全部到達(dá)屏障....");
}
}
結(jié)果:
index:1
index:2
index:0
index:3
index:4
index:8
index:6
index:7
index:9
index:5
所有特工到達(dá)屏障,準(zhǔn)備開始執(zhí)行秘密任 務(wù)
全部到達(dá)屏障....