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

      

  • 相关阅读:
    Java的参数传递是「按值传递」还是「按引用传递」?
    算法08 五大查找之:二叉排序树(BSTree)
    算法07 五大查找之:索引查找
    算法06 五大查找之:二分查找
    Django rest_framework实现RESTful API
    jenkins + pipeline构建自动化部署
    jenkins部署.net平台自动化构建
    python实现编写windows服务
    iis部署python运行环境
    Jenkins执行批处理文件、powershell失败
  • 原文地址:https://www.cnblogs.com/cnxieyang/p/12775355.html
Copyright © 2020-2023  润新知