zoukankan      html  css  js  c++  java
  • CyclicBarrier使用场景

    CyclicBarrier是java提供的同步辅助类。
    一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point),才得以继续执行。阻塞子线程,当阻塞数量到达定义的参与线程数后,才可继续向下执行。

    public class BarrierMain {
    
        public static void main(String[] args) {
            ThreadPoolExecutor executor=new ThreadPoolExecutor(5,5,1, TimeUnit.SECONDS
                    ,new ArrayBlockingQueue<Runnable>(10)){
                @Override
                protected void afterExecute(Runnable r, Throwable t) {
                    super.afterExecute(r, t);
                }
            };
            CyclicBarrier cyclicBarrier=new CyclicBarrier(3, new Runnable() {
                @Override
                public void run() {
                    System.out.println("=====当前阶段已完成");
                }
            });
            executor.submit(new BarrierDemo(cyclicBarrier));
            executor.submit(new BarrierDemo(cyclicBarrier));
            executor.submit(new BarrierDemo(cyclicBarrier));
            System.out.println("====主线程执行完毕");
            executor.shutdown();
        }
    }
    public class BarrierDemo implements Runnable {
    
        private final CyclicBarrier barrier;
    
    
        public BarrierDemo(CyclicBarrier barrier) {
            this.barrier = barrier;
        }
    
        @Override
        public void run() {
            try {
                System.out.println(Thread.currentThread().getName()+"到达现场");
                Thread.sleep(5000);
                //阻塞子线程
                barrier.await();
                //继续执行
                System.out.println(Thread.currentThread().getName()+"开始表演");
                Thread.sleep(5000);
                barrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }

    CountDownLatch与CyclicBarrier:
    CountDownLatch是一个同步的辅助类,允许一个或多个线程,等待其他一组线程完成操作,被等待线程(例如主线程)再继续执行。
    CyclicBarrier是一个同步的辅助类,允许一组线程相互之间等待,达到一个共同点,子线程再继续执行。CyclicBarrier可以被重用,比如有三个线程,执行逻辑到达同步点阻塞,到齐后被唤醒,又再次执行逻辑,到达下一个同步点,到齐后再被唤醒
    区别:

    1. CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset() 方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次
    2. CyclicBarrier还提供getNumberWaiting(可以获得CyclicBarrier阻塞的线程数量)、isBroken(用来知道阻塞的线程是否被中断)等方法。
    3. CountDownLatch会阻塞主线程,CyclicBarrier不会阻塞主线程,只会阻塞子线程。


    Don’t hurry say have no choice, perhaps, next intersection will meet hope.
  • 相关阅读:
    VysorPro助手
    Play 2D games on Pixel running Android Nougat (N7.1.2) with Daydream View VR headset
    Play 2D games on Nexus 6P running Android N7.1.1 with Daydream View VR headset
    Native SBS for Android
    ADB和Fastboot最新版的谷歌官方下载链接
    How do I install Daydream on my phone?
    Daydream Controller手柄数据的解析
    蓝牙BLE传输性能及延迟分析
    VR(虚拟现实)开发资源汇总
    Android(Java)控制GPIO的方法及耗时分析
  • 原文地址:https://www.cnblogs.com/volare/p/14407519.html
Copyright © 2011-2022 走看看