并发控制-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出发了

  

原文地址:https://www.cnblogs.com/cnxieyang/p/12775355.html