zoukankan      html  css  js  c++  java
  • CyclicBarrier使用

    demo1:

    package concurrent._Barrier;
    
    import java.util.Random;
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    
    public class Demo {
        public static void main(String[] args) {
            CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
            for(int i = 0 ;i < 5 ; i ++){
                new Woker(new Integer(i).toString(),cyclicBarrier).start();
            }
    
    
        }
    
    }
    
    class Woker extends  Thread{
    
        private CyclicBarrier cyclicBarrier;
        public Woker(String name,CyclicBarrier cyclicBarrier){
            super(name);
            this.cyclicBarrier = cyclicBarrier;
        }
    
        @Override
        public void run() {
            String threadName = this.getName();
            try {
                int i = new Random().nextInt(5000);
                Thread.sleep(i);
                System.out.println(threadName + "已经在运行" + i + "ms后到达栅栏");
                cyclicBarrier.await();
                System.out.println(threadName + "继续运行");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }

    结果:

    4已经在运行71ms后到达栅栏
    1已经在运行1925ms后到达栅栏
    0已经在运行2006ms后到达栅栏
    2已经在运行3056ms后到达栅栏
    3已经在运行4434ms后到达栅栏
    3继续运行
    4继续运行
    1继续运行
    2继续运行
    0继续运行

    修改代码:

    在到达栅栏之后,栅栏随机选取一个线程,进行一个操作。

    package concurrent._Barrier;
    
    import java.util.Random;
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    
    public class Demo {
        public static void main(String[] args) {
            CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"正在执行Runnable");
                }
            });
            for(int i = 0 ;i < 5 ; i ++){
                new Woker(new Integer(i).toString(),cyclicBarrier).start();
            }
    
    
        }
    
    }
    
    class Woker extends  Thread{
    
        private CyclicBarrier cyclicBarrier;
        public Woker(String name,CyclicBarrier cyclicBarrier){
            super(name);
            this.cyclicBarrier = cyclicBarrier;
        }
    
        @Override
        public void run() {
            String threadName = this.getName();
            try {
                int i = new Random().nextInt(5000);
                Thread.sleep(i);
                System.out.println(threadName + "已经在运行" + i + "ms后到达栅栏");
                cyclicBarrier.await();
                Thread.sleep(1000);
                System.out.println(threadName + "继续运行");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }

    结果:

    4已经在运行1582ms后到达栅栏
    0已经在运行1932ms后到达栅栏
    1已经在运行1967ms后到达栅栏
    2已经在运行2128ms后到达栅栏
    3已经在运行3582ms后到达栅栏
    3正在执行Runnable
    4继续运行
    2继续运行
    0继续运行
    1继续运行
    3继续运行

    从结果可以看出,在到达栅栏之后,首先执行Runnable中的函数,然后再执行线程中的剩余的操作。

  • 相关阅读:
    Modbus RTU与Modbus TCP的区别
    《对比Excel,轻松学习Python数据分析》笔记
    字符串 批量删除
    地图服务在线资源
    Java环境变量配置及maven配置
    Android学习路线
    MySQL备份脚本,应该这么写
    Windows中mysql5.6升级5.7
    SQL Server数据分析面试题(202008)
    PYTHON-未知错误
  • 原文地址:https://www.cnblogs.com/da-peng/p/10028675.html
Copyright © 2011-2022 走看看