Fork me on GitHub

CyclicBarrier的用法

CyclicBarrier (加法计数器)

关闸,当有指定个数线程等待时,开闸,执行每个线程cyclicBarrier.await()后的操作

例:田径比赛,当所有参赛选手都到入位时(即已有给定数量线程调用cyclicBarrier.await();),开信号枪,所有选手进入比赛(执行各自线程中的任务)

package juc.add;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @Description: juc.add
 * @version: 1.0
 */
//加法计数器
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        /*
        田径比赛
         */
        //当给定数量的线程(线程)等待时,它将跳闸,当屏障跳闸时执行给定的屏障动作,由最后一个进入屏障的线程执行。
        CyclicBarrier cyclicBarrier=new CyclicBarrier(7,()->{
            System.out.println("所有参赛选手已准备就绪,比赛开始!");
        });
        for (int i = 1; i <= 7; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"号选手准备就绪!");
                try {
                    cyclicBarrier.await();//等待所有 parties已经在这个障碍上调用了 await 。(让线程阻塞直到有7个线程阻塞于此)
                    System.out.println(Thread.currentThread().getName()+"号选手冲入终点!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i)).start();
        }

    }
}

运行结果:

posted @ 2021-01-18 12:27  雾深  阅读(1064)  评论(0编辑  收藏  举报