zoukankan      html  css  js  c++  java
  • 并发控制-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出发了
    

      

  • 相关阅读:
    Unix配置定时执行任务
    在Mac上使用Make编译时出现clang: error: unsupported option '-fopenmp'的解决办法
    git的一些操作
    Github误上传多余的文件夹后解决办法
    Ubuntu18.04安装使用YOLOv3
    本地IDEA中使用Spark直连集群上的Hive
    如何利用dokcer提交我的比赛代码
    Activiti7之整合spring和spring boot
    Activiti7之网关
    Activiti7之组任务
  • 原文地址:https://www.cnblogs.com/cnxieyang/p/12775355.html
Copyright © 2011-2022 走看看