1. 程式人生 > >多執行緒之柵欄CyclicBarrier

多執行緒之柵欄CyclicBarrier

柵欄和閉鎖功能類似,都是控制執行緒是否馬上繼續執行下去。區別就是:閉鎖是讓所有執行緒等待一組事件發生之後才能繼續執行下去,而柵欄就是等待一組執行緒到達之後才繼續執行下去。

就拿建築工地舉例:閉鎖相當於大門,所有工人等待大門開啟這個事件發生之後才能繼續通過;而柵欄就是相當於一個接送車,每一個工人就是一個執行緒,等到車上上滿之後,也就是指定的人到齊之後,車才能發動。

而柵欄相對閉鎖的區別還有一點就是柵欄可以迴圈使用:就比如接送車,送完了一組執行緒通過之後,繼續阻攔下一組執行緒。

簡單示例程式碼:這裡的柵欄初始數就是和實際執行緒數(初始數整數倍)一樣,如果柵欄指定的執行緒數大於實際執行執行緒數,那麼柵欄會一直等待,也就是說,如果等待接送車的人達不夠指定的人數,那麼司機永遠都不會開車。CyclicBarrier有一個建構函式有一個Runnable引數,這個Runnable會在柵欄結束等待的時候執行。

package cn.wzy.CyclicBarrier;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @author wzy 不短不長八字剛好.
 * @since 2018/8/19 20:52
 */
public class Main {

    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(9, new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("人到齊了,開始幹活..");
            }
        });
        for (int i = 0; i < 9; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("waiting...");
                    try {
                        barrier.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                    System.out.println("一起來幹活.");
                }
            }).start();
        }
    }
}