CyclicBarrier适用于这样的情况:你希望创建一组任务,它们并行的执行工作,然后在进行下一步步骤之前等待,直至所有任务都完成,它使得所有的并行任务都将在删栏出列队,因此可以一致的向前移动。

当调用await时  指定的任务运行完后会awiat  直到最后一个线程运行完毕,才继续执行下一步动作

用法和countDownLatch差不多  countDownLatch只触发一次,而CyclicBarrier可以多次重用


public class CyclicBarrierSimple {

public static void main(String[] args) {
int N = 4;
/**
* partie:在达到删栏时 指定的线程数被阻塞等待...
* barrierAction:到达删栏时 执行的线程任务
*/
CyclicBarrier barrier = new CyclicBarrier(N,new ThreadRunner());
for (int i = 0; i < N; i++) {
new Writer(barrier).start();
}
try {
Thread.sleep(25000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("CyclicBarrier重用");

for(int i=0;i<N;i++) {
new Writer(barrier).start();
}
}

static class ThreadRunner implements Runnable{

@Override
public void run() {
System.out.println("大家统一到达删栏后执行...");
}
}

static class Writer extends Thread {

private CyclicBarrier cyclicBarrier;

public Writer(CyclicBarrier barrier) {
cyclicBarrier = barrier;
}

@Override
public void run() {
System.out.println(System.currentTimeMillis() + "线程" + Thread.currentThread().getName() + " 正在写入数据...");
try {
//以睡眠来模拟写入数据库操作
TimeUnit.MILLISECONDS.sleep(1000);
System.out.println("线程" + Thread.currentThread().getName() + "写入数据完毕,等待其他线程写入完毕");
int index = cyclicBarrier.await();
System.out.println("越过栅栏后的索引" + index);
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "所有线程写入完毕,继续处理其他任务");

}
}
}
 

1553691604894线程Thread-1 正在写入数据...
1553691604894线程Thread-3 正在写入数据...
1553691604894线程Thread-2 正在写入数据...
1553691604894线程Thread-0 正在写入数据...
线程Thread-1写入数据完毕,等待其他线程写入完毕
线程Thread-0写入数据完毕,等待其他线程写入完毕
线程Thread-2写入数据完毕,等待其他线程写入完毕
线程Thread-3写入数据完毕,等待其他线程写入完毕
大家统一到达删栏后执行...
越过栅栏后的索引0
越过栅栏后的索引1
越过栅栏后的索引3
Thread-1所有线程写入完毕,继续处理其他任务
越过栅栏后的索引2
Thread-0所有线程写入完毕,继续处理其他任务
Thread-2所有线程写入完毕,继续处理其他任务
Thread-3所有线程写入完毕,继续处理其他任务
CyclicBarrier重用
1553691629896线程Thread-4 正在写入数据...
1553691629896线程Thread-5 正在写入数据...
1553691629896线程Thread-6 正在写入数据...
1553691629896线程Thread-7 正在写入数据...
线程Thread-5写入数据完毕,等待其他线程写入完毕
线程Thread-6写入数据完毕,等待其他线程写入完毕
线程Thread-4写入数据完毕,等待其他线程写入完毕
线程Thread-7写入数据完毕,等待其他线程写入完毕
大家统一到达删栏后执行...
越过栅栏后的索引0
越过栅栏后的索引3
Thread-5所有线程写入完毕,继续处理其他任务
越过栅栏后的索引1
Thread-4所有线程写入完毕,继续处理其他任务
越过栅栏后的索引2
Thread-6所有线程写入完毕,继续处理其他任务
Thread-7所有线程写入完毕,继续处理其他任务

CyclicBarrier(栅栏)的用法详解及与countDownLatch用法区别的更多相关文章

  1. SQL中CONVERT()函数用法详解

    SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...

  2. canvas arcTo()用法详解 – CodePlayer

    canvas arcTo()用法详解 – CodePlayer canvas arcTo()用法详解

  3. Java并发编程1--synchronized关键字用法详解

    1.synchronized的作用 首先synchronized可以修饰方法或代码块,可以保证同一时刻只有一个线程可以执行这个方法或代码块,从而达到同步的效果,同时可以保证共享变量的内存可见性 2.s ...

  4. netstat用法详解

    netstat用法详解 知识,netstat用法详解 图片 netstat用法详解 内容,netstat用法详介绍,netstat用法详正文 netstat命令是一个监控TCP/IP网络的非常有用的工 ...

  5. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  6. @RequestMapping 用法详解之地址映射

    @RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...

  7. linux管道命令grep命令参数及用法详解---附使用案例|grep

    功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

  8. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  9. CSS中伪类及伪元素用法详解

    CSS中伪类及伪元素用法详解   伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...

随机推荐

  1. BloomFilte布隆过滤器简介

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...

  2. PyQt(Python+Qt)学习随笔:枚举类QTreeWidgetItem.ItemType、QListWidgetItem.ItemType的取值及含义

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在Model/View的便利类QTreeWidget.QListWidgetItem中的项类型分别是 ...

  3. Python+Qt学习随笔:PyQt中常用的事件处理函数

    在PyQt图形界面中,我们经常要捕获特定事件如鼠标按键按下.鼠标按下等事件以执行特定操作,可以通过重写组件对象的相关事件处理函数来实现相关处理,具体特定事件常用的包括如下: keyPressEvent ...

  4. HTML基础之标签

    HTML初识 HTML(Hpyer Text Markup Language的缩写)译为"超文本标签语言",用来描述网页的一种语言.所谓超文本,因为它可以加入图片.声音.动画.多媒 ...

  5. 题解-比赛CF1332

    题解-比赛CF1332 比赛CF1332 [A] [B] [C] [D] [E] [F] [G] [A]Exercising Walk Exercising Walk \(T\) 组测试数据,每次给定 ...

  6. 计算机网络——HTTP知识点整理

    1.HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少.它 ...

  7. Java并发编程的艺术(七)——线程间的通信

    为什么需要线程间通信 让线程之间合作,提高运行效率. volatile和synchronized关键字 实现原理 这两个方式都是采用共享内存的方式进行通信,通过同步机制保证数据可见性和排他性. 特点 ...

  8. Chrome DevTools — Network -- 转载

    转载地址:https://segmentfault.com/a/1190000008407729 记录网络请求 默认情况下,只要DevTools在开启状态,DevTools会记录所有的网络请求,当然, ...

  9. python(iJmeter-master)接口测试程序部署实践

    记录学习性能测试过程遇到的问题 环境 安装环境如下: Windows 10 1803 VMWare Workstation 15 Pro Centos Linux release 7.9.2009(c ...

  10. 图的遍历DFS

    图的遍历DFS 与树的深度优先遍历之间的联系 树的深度优先遍历分为:先根,后根 //树的先根遍历 void PreOrder(TreeNode *R){ if(R!=NULL){ visit(R); ...