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:执行结果