并发编程-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

posted @ 2018-12-20 16:03  qjm201000  阅读(261)  评论(0编辑  收藏  举报