• 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: liufei32@outlook.com
     * @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
    欢迎交流指正,如有侵权请联系作者确认删除: liufei32@outlook.com

  • 相关阅读:
    jQuery选择器
    ViewState对象与Session对象、Cookie对象
    angularjs关于$scope的生命周期详解(转)
    了解AngularJS的$scope的工作原理和生命周期(转载)
    angularjs route 路由
    angularJS--依赖注入
    angularjs动画-ngAnimate--快速上手、使用
    深入浅出理解AngularJS模块
    Angular入门1-之-基础概览02
    Angular入门1-之-基础概览01
  • 原文地址:https://www.cnblogs.com/Swagger-Ranger/p/10669940.html
Copyright © 2020-2023  润新知