zoukankan      html  css  js  c++  java
  • Java中关于CyclicBarrier的使用

    CyclicBarrier工具类主要是控制多个线程的一起执行,CyclicBarrier 实例可以多次使用。

    演示程序:

    import java.util.Random;
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    
    /**
     * 
     * CyclicBarrier和CountDownLatch功能类似,都可以用作在所有线程都做好准备(比如赛跑:
     * 每一个运动员可以认为是一个线程,只有当所有运动员做好准备才能鸣枪开始跑)之后一起触发运行。 <br>
     * <br>
     * 但是也有区别:<br>
     * 1:CountDownLatch(初始值为线程个数)需要每当一个线程准备好之后,调用一下countDown方法,告诉CountDownLatch又有一个线程已经完成准备,当CountDownLatch值为0时候则触发所有线程一起执行<br>
     * 2:CyclicBarrier(初始值为线程个数)需要每当一个线程准备好之后运行时候会阻塞在await处,当所有线程都阻塞在await处时候,即可触发所有线程执行。(CyclicBarrier:可以循环使用,每当触发完毕一次之后还可以
     * 再次使用该CyclicBarrier的实例对象)
     */
    public class CyclicBarrierDemo {
    
        public static void main(String[] args) throws Exception {
            /**
             * 重复使用的CyclicBarrier对象实例
             */
            CyclicBarrier c = new CyclicBarrier(3);
            
            startThread(c); //第一次使用CyclicBarrier示例
            Thread.sleep(5 * 1000);
            startThread(c);
            Thread.sleep(5 * 1000);
            startThread(c);
    
        }
    
        /**
         * 
         * @param c 重复使用的CyclicBarrier对象实例
         */
        public static void startThread(CyclicBarrier c) {
            
            Thread t1 = newThread("t1", c);
            Thread t2 = newThread("t2", c);
            Thread t3 = newThread("t3", c);
            t1.start();
            t2.start();
            t3.start();
        }
    
        public static Thread newThread(final String threadName, final CyclicBarrier c) {
    
            return new Thread(new Runnable() {
    
                @Override
                public void run() {
                    try {
                        int time = new Random().nextInt(3);
                        System.out.println(threadName + " sleep " + time + "秒 。");
                        Thread.sleep(time * 1000);
                        c.await(); //当所有线程都阻塞在此处时候触发所有线程执行
                        System.out.println(threadName + " is running .");
                    } catch (InterruptedException | BrokenBarrierException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
    
                }
            }, threadName);
        }
    
    }
  • 相关阅读:
    sql
    Java后台通过传参得到对应的坐标值的方法
    运行第一个大型项目工程时出现的问题
    对sqlserver存储过程合游标循环中的一点心得
    (基于Java)算法之动态规划——矩阵连乘问题
    算法之线性时间选择(最坏情况下)
    算法之快速排序
    算法之合并排序
    算法之二分搜索法
    设计模式之装饰者模式
  • 原文地址:https://www.cnblogs.com/leodaxin/p/7653192.html
Copyright © 2011-2022 走看看