cyclicbarier源码分析

目录

1:cyclicBarrier的原理是基于condition来实现的,不懂condition的可以看我的上一篇博客:

https://www.cnblogs.com/xzlnuli/p/16130351.html

2:cyclicBarrier的使用demo

构造方法:

public CyclicBarrier(int parties)

public CyclicBarrier(int parties, Runnable barrierAction)

解析:

parties 是参与线程的个数
第二个构造方法有一个 Runnable 参数,这个参数的意思是最后一个到达线程要做的任务

2.1:构建测试demo类

package com.saytoyou.com.thread;

import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierDemo implements Runnable {

    private CyclicBarrier cyclicBarrier;

    public CyclicBarrierDemo(CyclicBarrier cyclicBarrier) {
        this.cyclicBarrier = cyclicBarrier;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName() + "到达栅栏A");

            cyclicBarrier.await();

            System.out.println(Thread.currentThread().getName() + "冲破栅栏A");
            //Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName()+"到达栅栏B");
            cyclicBarrier.await();
            System.out.println(Thread.currentThread().getName()+"冲破栅栏B");

        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

2.2:使用cyclicBarrier测试

package com.saytoyou.com.thread;

import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {

    public static void main(String[] args) {

        CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
            @Override
            public void run() {
                System.out.println("我们已经完成了cyclicbarrier的测试!!!!");
            }
        }); // 构建cyclicBarrier,第一个参数是线程个数,第二个是都完成后需要执行的任务

        for (int i = 0; i < 5; i++) {
            new Thread(new CyclicBarrierDemo(cyclicBarrier)).start();
        }

    }
}

2.3:执行结果

 

posted @ 2022-04-12 15:46  xzlnuli  阅读(31)  评论(0编辑  收藏  举报