zoukankan      html  css  js  c++  java
  • CyclicBarrier

      CyclicBarrier也叫回环栅栏,在JDK1.5被引入,可以让一组线程达到一个栅栏时被阻塞,直到最后一个线程达到栅栏时,所以被阻塞的线程才能继续执行。
      CyclicBarrier好比一扇门,默认情况下关闭状态,堵住了线程执行的道路,直到所有线程都就位,门才打开,让所有线程一起通过。
      叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。
      栅栏举例:几个人准备去聚餐,约定什么时间在某个地方等,先到的人要等所有人到了之后再一起出发。


    两个构造方法:

      public CyclicBarrier(int parties, Runnable barrierAction) {}

     
      public CyclicBarrier(int parties) {}
      
      参数parties指让多少个线程或者任务等待至barrier状态。
      参数barrierAction是一个Runnable,当成功通过栅栏会(在一个子线程中)执行它,但在阻塞线程被释放之前是不能执行的。
     
     
     1 public class Test {
     2     public static void main(String[] args) {
     3         CyclicBarrier barrier  = new CyclicBarrier(4);
     4         for(int i=0;i<4;i++)
     5             new Writer(barrier).start();
     6     }
     7     static class Writer extends Thread{
     8         private CyclicBarrier cyclicBarrier;
     9         public Writer(CyclicBarrier cyclicBarrier) {
    10             this.cyclicBarrier = cyclicBarrier;
    11         }
    12  
    13         @Override
    14         public void run() {
    15             System.out.println("线程"+Thread.currentThread().getName()+"正在写入数据...");
    16             try {
    17                 Thread.sleep(5000);      //以睡眠来模拟写入数据操作
    18                 System.out.println("线程"+Thread.currentThread().getName()+"写入数据完毕,等待其他线程写入完毕");
    19                 cyclicBarrier.await();
    20             } catch (InterruptedException e) {
    21                 e.printStackTrace();
    22             }catch(BrokenBarrierException e){
    23                 e.printStackTrace();
    24             }
    25             System.out.println("所有线程写入完毕,继续处理其他任务...");
    26         }
    27     }
    28 }
  • 相关阅读:
    说说Java中的代理模式
    一个奇怪的异常
    JDBC第二次学习
    浅谈事务
    JDBC第一次学习
    Firebug & Chrome Console 控制台使用指南
    js 事件创建发布
    vue ui之 iview 事件拦截
    fetch获取json的正确姿势
    js对象通过属性路径获取属性值
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/9894982.html
Copyright © 2011-2022 走看看