zoukankan      html  css  js  c++  java
  • 并发编程-concurrent指南-回环栅栏CyclicBarrier

    字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。

    java.util.concurrent.CyclicBarrier 类是一种同步机制,它能够对处理一些算法的线程实现同步。换句话讲,它就是一个所有线程必须等待的一个栅栏,直到所有线程都到达这里,然后所有线程才可以继续做其他事情。

    字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。
    叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。
    叫做栅栏,大概是描述所有线程被栅栏挡住了,当都达到时,一起跳过栅栏执行,也算形象。我们可以把这个状态就叫做barrier。
    通过CyclicBarrier的await()方法,线程就处于barrier状态。
    CyclicBarrier应用场景例子
    10个人跑步,人来全了,等到发令枪枪声后,开始跑
    具体代码:
    import java.util.concurrent.CyclicBarrier;
    
    public class Main {
        public static void main(String[] args) {
            int player_count = 10;//10个参赛选手
    
            Admin admin = new Admin();//发令枪管理员
            CyclicBarrier cyclicBarrier = new CyclicBarrier(player_count,admin);
            for(int i = 0;i < 10;i++){
                Player player = new Player(cyclicBarrier);
                new Thread(player).start();
            }
        }
    }
    /**
     * 管理员发令开跑
     */
    public class Admin implements Runnable{
        @Override
        public void run() {
            System.out.println("选手已来齐,跑");
        }
    }
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    
    /**
     * 选手
     */
    public class Player implements  Runnable{
        private CyclicBarrier cyclicBarrier;
        public Player(CyclicBarrier cyclicBarrier){
            this.cyclicBarrier = cyclicBarrier;
        }
    
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+",准备跑");
            try {
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"开跑");
        }
    }

    结果:

    Thread-0,准备跑
    Thread-1,准备跑
    Thread-2,准备跑
    Thread-4,准备跑
    Thread-3,准备跑
    Thread-5,准备跑
    Thread-6,准备跑
    Thread-7,准备跑
    Thread-8,准备跑
    Thread-9,准备跑
    选手已来齐,跑
    Thread-1开跑
    Thread-0开跑
    Thread-4开跑
    Thread-7开跑
    Thread-2开跑
    Thread-9开跑
    Thread-8开跑
    Thread-6开跑
    Thread-5开跑
    Thread-3开跑

    适用场景:

    CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;

    源码地址:https://github.com/qjm201000/concurrent_cyclicBarrier.git

  • 相关阅读:
    Delphi 控件使用谷歌浏览器控件chromium 安装包是 dcef3-20140522 --碰到的问题
    salesforce零基础学习(九十九)Git 在salesforce项目中的应用(vs code篇)
    Salesforce LWC学习(二十) CLI篇:新版本不支持Audience解决方案
    Salesforce LWC学习(十九) 针对 lightning-input-field的label值重写
    apt安装后需要移除的问题
    mysql 触发器阻止不合理数据插入
    本机环境virtualbox出现问题重装
    php 版本升级后需要对代码进行兼容性检测
    k8s使用需认证的私服仓库
    无法启动electron,提示node_modules/electron/dist/chrome-sandbox is owned by root and has mode 4755.
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10149974.html
Copyright © 2011-2022 走看看