CyclicBarrier

柵欄屏障,讓一組線程到達(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á)屏障....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容