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中的函数,然后再执行线程中的剩余的操作。

  • 相关阅读:
    普通的一个python脚本,hadoop进军的准备
    Python之数据类型讲解
    开始博客的理由
    【微机原理及应用】程序的分类
    【jvm】jvm学习第二篇。jvm运行机制
    【jvm】jvm学习第一篇。初识jvm
    【it公司】it公司简介-项目流程-研发小技巧
    【感悟】20岁的人生不应该停止奋斗。----------------努力努力再努力
    【书籍学习】史上最全的Java进阶书籍推荐
    【职业规划】3年工作经验的程序员应该具备的技能
  • 原文地址:https://www.cnblogs.com/da-peng/p/10028675.html
Copyright © 2011-2022 走看看