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);
        }
    
    }
  • 相关阅读:
    HDU 3829 Cat VS Dog (最大独立集)【二分图匹配】
    POJ 2594 Treasure Exploration (Floyd+最小路径覆盖)
    HDU 1054 Strategic Game (最小点覆盖)【二分图匹配】
    HDU 4185 Oil Skimming 【最大匹配】
    HDU 2389 Rain on your Parade 最大匹配(模板题)【HK算法】
    HDU 1281 棋盘游戏 (枚举+最大匹配)
    HDU 1045 Fire Net 【二分图匹配】
    POJ 1904 King's Quest (强连通分量+完美匹配)
    HDU 4635 Strongly connected (强连通分量+缩点)
    POJ 2631 Roads in the North (模板题)(树的直径)
  • 原文地址:https://www.cnblogs.com/leodaxin/p/7653192.html
Copyright © 2011-2022 走看看