• 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任务。
  • 相关阅读:
    链表相交
    环路检测
    lambada表达式对集合的过滤和相互转换
    lambda表达式对集合的遍历
    centos7常用命令
    小程序文件
    扫码登录
    位操作
    使用json-lib转换对象为字符串时的特殊处理
    javac 编译异常总结
  • 原文地址:https://www.cnblogs.com/yaowen/p/9334819.html
Copyright © 2020-2023  润新知