CyclicBarrier是一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。今天我們就學習一下CyclicBarrier的用法。
?
CyclicBarrier的簡單使用
類CyclicBarrier不僅有CountDownLatch所具有的功能,還可以實現屏障等待的功能,也就是階段性同步,它在使用上的意義在于可以循環地實現線程要一起做任務的目標,而不是像類CountDownLatch一樣,僅僅支持一次線程與同步點阻塞的特性。
關于CyclicBarrier常用的方法的介紹:
package com.linux.huhx.concurreny;import java.io.IOException; import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class CyclicBarrierTest1 {public static void main(String[] args) throws IOException, InterruptedException {/*** 1、如果參數>3的話,三個線程的await執行完,parties只能加到3。那么子線程await后續的方法就不能執行* 2、如果參數=3的話,三個線程的await執行完,parties能加到3。所以子線程await后續的方法能執行* 3、如果參數<3的話,當第二個線程await執行完之后,parties加到了2。??????*/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號選手")));Thread.sleep(200);System.out.println("in main method after");executor.shutdown();}public static 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;}@Overridepublic void run() {try {Thread.sleep(new Random().nextInt(1000));System.out.println(name + " 準備好了...");// barrier的await方法,在所有參與者都已經在此 barrier 上調用 await 方法之前,將一直等待。 barrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println(name + " 起跑!");}} }
運行的結果如下:執行的結果不固定
in main method after 2號選手 準備好了... 1號選手 準備好了... 3號選手 準備好了... 2號選手 起跑! 1號選手 起跑! 3號選手 起跑!
?
友情鏈接
- 比較好的參考博客:http://blog.csdn.net/shihuacai/article/details/8856407
?