java.util.concurrent.CyclicBarrier 使用

1.概述

  java.util.concurrent.CyclicBarrier(循环的栅栏), 构造时设置一个计数器数(count),

  各线程通过调用barrier.await()进入等待,并且计数+1, 第count个线程调用await(),满足条件,

  唤醒所有之前调用await等待的线程(类似于公司班车, A上车A等着,B上车B等着, ...最后一个Z上车了, 班车发车)

2. 示例

package com.rocky.test.CyclicBarrier;

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

public class CyclicBarrierTest {

    
    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(10, new Runnable(){
            public void run(){
                System.out.println("inside barrier.................."+ Thread.currentThread().getName());
            }
        });
        for(int i=0; i<10; i++)
            new Thread(new Worker(barrier)).start();
    }
}

class Worker implements Runnable{

    private CyclicBarrier barrier;
    Worker(CyclicBarrier barrier){
        this.barrier = barrier;
    }
    @Override
    public void run() {

        System.out.println(Thread.currentThread().getName()+" ready go... ");
        try {
            barrier.await();
            System.out.println(Thread.currentThread().getName()+" done");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}

控制台

..........
Thread-8 ready go... 
Thread-9 ready go... //最后一个执行await()的线程,会执行构造CyclicBarrier时Runnable中的任务(run()方法)
inside barrier..................Thread-9
Thread-9 done
Thread-0 done
..............

3. 说明        和CountDownLatch比较

   3.1 之所以叫CyclicBarrier(cyclic循环之意), 因为构造时设置的count可以循环运用

        一圈await结束之后, 线程继续调用await进入下一轮等待直到第count个线程await时一起唤醒。

   3.2 await()方法带有返回值,表示当前是第几个到达barrier的线程

   3.3 BrokenBarrierException异常  当某个等待的线程发生中断,会抛出该异常,其他等待的线程也会收到该异常,并返回。

..........
 if (g.broken)
                    throw new BrokenBarrierException();
原文地址:https://www.cnblogs.com/rocky-fang/p/6763794.html