Java CyclicBarrier

CyclicBarrier

CyclicBarrier,需要等待一组线程全部到达一个指定的点后才能一起执行,就如果开会,需要等人都到齐才开始一样。
创建一个新的 CyclicBarrier ,当给定数量的线程(线程)正在等待时,它将跳闸,当屏障跳闸时执行给定的屏障动作,由最后一个进入屏障的线程执行。
允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。

package JavaCore.MultiThread.advanced.ThreadCorrespondence;

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

/*******************************************************************************
 * @Copyright (C), 2018-2019,github:Swagger-Ranger 
 * @FileName: ThreadOfCyclicBarrier
 * @Author: [email protected]
 * @Date: 2019/3/12 14:44
 * @Description: CyclicBarrier使用示例
 * @Aha-eureka:
 *******************************************************************************/

public class ThreadOfCyclicBarrier {

    Random random = new Random();

    public void meeting( CyclicBarrier barrier ) {

        try {
            Thread.sleep(random.nextInt(4000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Thread.currentThread().getName() + "  到达,等待会议开始...");

        if (Thread.currentThread().getName().equals("Thread-1")) {
            throw new RuntimeException("模拟异常,当出现异常后面的await就不会执行");
        }

        try {
            //设置barrier,等待被唤醒
            barrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }

        //barrier.await() 之后线程继续执行
        System.out.println(Thread.currentThread().getName() + "  会议发言...");
    }

    public static void main( String[] args ) {

        ThreadOfCyclicBarrier tcb = new ThreadOfCyclicBarrier();
        //创建一个新的 CyclicBarrier ,当给定数量的线程(线程)正在等待时,它将跳闸,当屏障跳闸时执行给定的屏障动作,由最后一个进入屏障的线程执行。
        CyclicBarrier barrier = new CyclicBarrier(10, () -> System.out.println(Thread.currentThread().getName() + "不好意思,我是最后一个到的,我们开始开会吧..."));

        for (int i = 0; i < 11; i++) {
            //创建线程,并调用meeting方法将barrier传入方法中
            new Thread(() -> tcb.meeting(barrier)).start();
        }
    }
}

本博客为Swagger-Ranger的笔记分享,文中源码地址: https://github.com/Swagger-Ranger
欢迎交流指正,如有侵权请联系作者确认删除: [email protected]

猜你喜欢

转载自www.cnblogs.com/Swagger-Ranger/p/10669940.html