多執行緒之柵欄CyclicBarrier
阿新 • • 發佈:2019-01-27
柵欄和閉鎖功能類似,都是控制執行緒是否馬上繼續執行下去。區別就是:閉鎖是讓所有執行緒等待一組事件發生之後才能繼續執行下去,而柵欄就是等待一組執行緒到達之後才繼續執行下去。
就拿建築工地舉例:閉鎖相當於大門,所有工人等待大門開啟這個事件發生之後才能繼續通過;而柵欄就是相當於一個接送車,每一個工人就是一個執行緒,等到車上上滿之後,也就是指定的人到齊之後,車才能發動。
而柵欄相對閉鎖的區別還有一點就是柵欄可以迴圈使用:就比如接送車,送完了一組執行緒通過之後,繼續阻攔下一組執行緒。
簡單示例程式碼:這裡的柵欄初始數就是和實際執行緒數(初始數整數倍)一樣,如果柵欄指定的執行緒數大於實際執行執行緒數,那麼柵欄會一直等待,也就是說,如果等待接送車的人達不夠指定的人數,那麼司機永遠都不會開車。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(); } } }