并发编程-concurrent指南-回环栅栏CyclicBarrier

Posted qjm201000

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程-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开跑

 

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



以上是关于并发编程-concurrent指南-回环栅栏CyclicBarrier的主要内容,如果未能解决你的问题,请参考以下文章

并发编程-concurrent指南-ConcurrentMap

并发编程-concurrent指南-阻塞队列-延迟队列DelayQueue

并发编程-concurrent指南-Lock-可重入锁(ReentrantLock)

CyclicBarrier

Java并发编程之闭锁与栅栏

Java_并发工具包 java.util.concurrent 用户指南(转)