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

  • 相关阅读:
    pandas --index ,reindex, set_index, reset_index , reindex_like函数 之 reset_index
    pandas --index ,reindex, set_index, reset_index , reindex_like函数 之 reindex
    pandas 合并操作 append处理重复项
    pandas --合并操作concat函数和append
    pandas --合并操作join函数
    pandas 做合并操作-merge函数
    百度地图应用
    jstl 标签 的应用
    Linux 下MySQL 安装与卸载
    Linux 下tomcat的配置
  • 原文地址:https://www.cnblogs.com/da-peng/p/10028675.html
Copyright © 2011-2022 走看看