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

  • 相关阅读:
    2015/11/2用Python写游戏,pygame入门(2):游戏中的事件和显示
    2015/11/1用Python写游戏,pygame入门(1):pygame的安装
    2015/10/13 算法习题:最大子列和问题
    2015/10/9 Python核编初级部分学习总结
    2015/10/9 Python基础(21):可调用和可执行对象
    2015/9/29 Python基础(20):类的授权
    2015/9/28 Python基础(19):类的定制和私有性
    2015/9/22 Python基础(18):组合、派生和继承
    2015/9/21 Python基础(17):绑定和方法调用
    MVC 依赖注入
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10149974.html
Copyright © 2011-2022 走看看