• 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);
        }
    
    }
  • 相关阅读:
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    log4net写txt日志
    easyui上传文件
    让 SVN (TortoiseSVN)提交时忽略bin和obj目录
    C#进阶系列——WebApi 跨域问题解决方案:CORS
    js控制radio选中
    sql注入
    修改类不用重启Tomcat加载整个项目
    URIEncoding与useBodyEncodingForURI 在tomcat中文乱码处理上的区别
    ActiveMQ 使用场景
  • 原文地址:https://www.cnblogs.com/leodaxin/p/7653192.html
Copyright © 2020-2023  润新知