1. 程式人生 > >java.util.concurrent CyclicBarrier類

java.util.concurrent CyclicBarrier類

實現 .cn tint style pub interrupt com err rup

CyclicBarrier類:

  原文:一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的線程的程序中,這些線程必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier 在釋放等待線程後可以重用,所以稱它為循環的 barrier。CyclicBarrier支持一個可選的 Runnable 命令,在一組線程中的最後一個線程到達之後(但在釋放所有線程之前),該命令只在每個屏障點運行一次。若在繼續所有參與線程之前更新共享狀態,此屏障操作 很有用。

  說人話:它可以讓多個線程阻塞,調用CyclicBarrier的await()方法讓線程一直在等待,直到所有線程都到達屏障後再喚醒。

  CyclicBarrier提供2個構造方法:

    CyclicBarrier(int parties)

    CyclicBarrier(int parties, Runnable barrierAction)

  下面的例子使用第二個構造方法,模擬10個狙擊手分別就位,如果10個狙擊手都已經就位完畢,則報告給指揮官,指揮官下達命令後才能進行射擊。

public class Demo {

    public static void main(String[] args) {

        //定義10個狙擊手
        int threadNum = 10;

        
//實例化一個CyclicBarrier(循環屏障) CyclicBarrier cyclicBarrier = new CyclicBarrier(threadNum, new Runnable(){ @Override public void run(){ System.out.println("負責人:報告指揮官,所有狙擊手已就位完畢。"); System.out.println("指揮官:行動!"); } });
//模擬加入10個線程 for(int i=1; i<=threadNum; i++){ new Thread(new Sniper(cyclicBarrier, "狙擊手" + i + "號")).start(); } } }

  定義一個狙擊手的類,並實現Runnable接口。

public class Sniper implements Runnable {

    private CyclicBarrier cyclicBarrier;
    private String name;

    public Sniper(CyclicBarrier cyclicBarrier, String name){
        this.cyclicBarrier = cyclicBarrier;
        this.name = name;
    }

    @Override
    public void run() {
        try {

            //隨機0-10秒模擬狙擊手就位需要的時間
            Random ran = new Random();
            int millisecond = (ran.nextInt(10) + 1);
            int second = millisecond * 1000;
            Thread.sleep(second);

            //準備好之後,報告已就位
            System.out.println( name + ":已就位,用時" + millisecond + "秒。");

            //調用cyclicBarrier.await()方法進行等待
            cyclicBarrier.await();

            //狙擊手打擊目標
            System.out.println( name + ":報告," + (millisecond % 2 == 1 ? "已擊斃敵人。" : "未命中。"));

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}

  效果如下:

技術分享

java.util.concurrent CyclicBarrier類