CyclicBarrier

一、CyclicBarrier的定義

一個同步輔助類,它容許一組線程相互等待,直到到達某個公共屏障點(common barrier point)。就是全部子程序都執行完成以後,開始執行主程序。java

import java.util.Random;
import java.util.concurrent.*;

/**
 * Created by Administrator on 2017/5/22 0022.
 */
public class Test {

    public static void main(String[] args) {
        //若是將參數改成4,可是下面只加入了3個選手,這永遠等待下去
        CyclicBarrier barrier = new CyclicBarrier(3);
        ExecutorService executor = Executors.newFixedThreadPool(3);
        executor.submit(new Thread(new Runner(barrier,"1號選手")));
        executor.submit(new Thread(new Runner(barrier,"2號選手")));
        executor.submit(new Thread(new Runner(barrier,"3號選手")));
        executor.shutdown();

    }
}

class Runner implements Runnable{
    // 一個同步輔助類,它容許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)
    private CyclicBarrier barrier;

    private String name;

    public Runner(CyclicBarrier barrier, String name) {
        super();
        this.barrier = barrier;
        this.name = name;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(1000*(new Random()).nextInt(8));
            System.out.println(name+"準備好了!");
            barrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }

        System.out.println(name + " 起跑!");
    }

}

執行結果爲dom

二、CyclicBarrier和CountDownLatch的區別

首先看看javadoc中的解釋ide

  CountDownLatch:容許一個或多個線程等待直到在其餘線程中執行的一組操做完成的同步輔助。
      CyclicBarrier:一個容許一組線程所有相互等待達到共同屏障點的同步輔助功能。
this

那麼能夠看出spa

  CountDownLatch中是一個或多個線程在等待,其餘線程執行完了,能夠等待,也能夠終止。該類就像計數器, 線程完成一個就記一個, 就像 報數同樣, 只不過是遞減的.線程

  CyclicBarrier中是一個或多個線程在等待,其餘線程中任何一個未完成,其餘都必須等待。該類就像一個水閘, 線程執行就想水流, 在水閘處都會堵住, 等到水滿(線程到齊)了, 纔開始泄流.code

相關文章
相關標籤/搜索