并发控制-CycliBarrier
我们可以将CycliBarrier直译为循环栅栏,本文介绍下CycliBarrier的基本用法等。
CycliBarrier可以实现和CountDownLatch类似的功能,下文我们从代码实例和不同点进行解释说明。
不同点
CountDownLatch作用于事件,CycliBarrier作用于线程;
CycliBarrier可以重用
实例代码
下文我们详细通过一个集合出发的实例去说明,代码如下
package com.yang.concurrent; import javax.management.relation.RoleUnresolved; import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CylicBarrierDemo { public static void main(String[] args) { CyclicBarrier cyclicBarrier=new CyclicBarrier(5, new Runnable() { @Override public void run() { System.out.println("所有人都到齐了,大家可以出发了"); } }); for (int i = 0; i < 10; i++) { new Thread(new Task(i,cyclicBarrier)).start(); } } static class Task implements Runnable{ private int id; private CyclicBarrier cyclicBarrier; public Task(int id, CyclicBarrier cyclicBarrier) { this.id = id; this.cyclicBarrier = cyclicBarrier; } @Override public void run() { System.out.println(this.id+"开始前往集合地点"); try { Thread.sleep((long)(Math.random()*10000)); System.out.println(this.id+"到达了集合地点"); cyclicBarrier.await(); System.out.println(this.id+"出发了"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } } }
运行结果如下:我们发现CycliBarrier是可以被重置的。
0开始前往集合地点 1开始前往集合地点 2开始前往集合地点 3开始前往集合地点 4开始前往集合地点 5开始前往集合地点 6开始前往集合地点 7开始前往集合地点 8开始前往集合地点 9开始前往集合地点 8到达了集合地点 4到达了集合地点 5到达了集合地点 3到达了集合地点 7到达了集合地点 所有人都到齐了,大家可以出发了 7出发了 8出发了 5出发了 4出发了 3出发了 6到达了集合地点 2到达了集合地点 9到达了集合地点 1到达了集合地点 0到达了集合地点 所有人都到齐了,大家可以出发了 0出发了 6出发了 1出发了 2出发了 9出发了