zoukankan      html  css  js  c++  java
  • java多线程---CyclicBarrier

    package com.test;
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.BrokenBarrierException;
    
    public class CyclicBarrierTest1 {
    
        private static int SIZE = 5;
        private static CyclicBarrier cb;
        public static void main(String[] args) {
    
            cb = new CyclicBarrier(SIZE);
    
            // 新建5个任务
            for(int i=0; i<SIZE; i++)
                new InnerThread().start();
        }
    
        static class InnerThread extends Thread{
            public void run() {
                try {
                    System.out.println(Thread.currentThread().getName() + " wait for CyclicBarrier.");
    
                    // 将cb的参与者数量加1.每个线程都会在这里阻塞,直到加到5再一起走。
                    cb.await();
    
                    // cb的参与者数量等于5时,才继续往后执行
                    System.out.println(Thread.currentThread().getName() + " continued.");
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
    
     
    
    注意比较CountDownLatch和CyclicBarrier:
    (01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。
    (02) CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。
    结果说明:主线程中新建了5个线程,所有的这些线程都调用cb.await()等待。所有这些线程一直等待,直到cb中所有线程都达到barrier时,执行新建cb时注册的Runnable任务。
  • 相关阅读:
    GPU编程和流式多处理器(七)
    GPU编程和流式多处理器(六)
    vue——使用vant轮播组件swipe + flex时,文字抖动问题
    golang 修改字符串
    Go 彻底弄懂return和defer的微妙关系
    Redis 的持久化机制
    Redis 缓存击穿
    Redis 缓存穿透
    Redis 雪崩
    正则验证
  • 原文地址:https://www.cnblogs.com/yaowen/p/9334819.html
Copyright © 2011-2022 走看看