• 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 }
  • 相关阅读:
    oracle 导入数据语句
    移动上去换样式代码
    google suggest 代码例子
    删除一个表的字段的sql语句命令
    将json从前台传到后台注意问题
    eclipse 自动 getter setter 注释
    jsp界面获取地址栏参数
    常见的正则表达式验证
    JSTL 核心标签库
    javascript中的call和apply两个方法的区别
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/9894982.html
Copyright © 2020-2023  润新知