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

  • 相关阅读:
    php启用zlib压缩文件
    理解MySQL——架构与概念
    二级域名session 共享方案
    SessionID的本质
    PHP核心技术笔记(1):面向对象的核心概念
    改掉这些坏习惯,让你从php菜鸟变php高手
    理解MySQL——索引与优化
    [转]步步教你如何修改OS/400缺省的登陆画面
    [转]Delphi中的线程类
    [转]MSSQL重复记录处理
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10149974.html
Copyright © 2011-2022 走看看