CyclicBarrier原理解析

简介:

CyclicBarrier顾名思义是循环栅栏,和CountDownLatch非常功能非常相似,它也可以实现线程间的计数等待,但是它比CountDownLatch功能更加强大:它的内存屏障可以循环使用,它可以在等待的线程被释放之后重新使用。

示例:

public class CyclicBarrierTest {
    // 创建CyclicBarrier 示例,并初始化需要等待的线程数量
    private static CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
    public static void main(String[] args) throws InterruptedException {
        // 启动需要等待线程数量的2倍的线程,测试栅栏是否可以循环使用
        for(int i=0; i<2*3; i++){
            if (i>2){
               Thread.sleep(1000L);
            }
            new BarrierThread(i).start();
        }

    }

    static class BarrierThread extends Thread{
        int i;
        public BarrierThread(int i){
            this.i = i;
        }
        public void run() {
            try {
                System.out.println("Thread"+ i+ "在栅栏外等待。。。");
                // 阻塞当前线程,直到线程数量达到循环栅栏初始化的线程数量,否则线程一直处于等待状态
                cyclicBarrier.await();
                System.out.println("Thread"+ i + "继续执行。。。");
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

执行结果如下:
CyclicBarrier原理解析_第1张图片
示例表明CyclicBarrier果然名不虚传,栅栏的确可以循环使用。线程在栅栏外等待的时候可能会抛出两个异常:BrokenBarrierException和InterruptedException,InterruptedException是线程中断异常;BrokenBarrierException是CyclicBarrier破损异常,该异常表示系统无法等到CyclicBarrier所要求的线程数量,该异常避免了其它已经到达栅栏的线程陷入无尽的等待。

你可能感兴趣的:(JDK源码)