如何使用

java.util.concurrent.CyclicBarrier是Java并发并发编程中的线程同步工具类,基于java.util.concurrent.locks.ReentrantLock实现。

CyclicBarrier工具类主要应用在如下场景:让一组线程同时到达栅栏位置才能开始执行。

应用示例:

  1. public static void main(String[] args) {
  2. // 使用CyclicBarrier模拟多线程同时到达栅栏位置之后才开始执行
  3. int n = 10; // 线程数
  4. CyclicBarrier barrier = new CyclicBarrier(n);
  5. List resultList = new ArrayList(n);
  6. List<Thread> threadList = new ArrayList<>(n);
  7. for (int i = 0; i < n; i++) {
  8. int index = i;
  9. Thread thread = new Thread(new Runnable() {
  10. @Override
  11. public void run() {
  12. try {
  13. Thread.sleep((new Random().nextInt(10)) * 1000);
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. }
  17. try {
  18. System.out.println(String.format("线程%s准备好了", index));
  19. barrier.await();
  20. System.out.println(String.format("线程%s执行完毕!", index));
  21. resultList.add(String.format("result%s", index));
  22. } catch (InterruptedException e) {
  23. e.printStackTrace();
  24. } catch (BrokenBarrierException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. });
  29. threadList.add(thread);
  30. thread.start();
  31. }
  32. threadList.forEach(thread -> {
  33. try {
  34. // 等待线程执行完毕
  35. thread.join();
  36. } catch (InterruptedException e) {
  37. e.printStackTrace();
  38. }
  39. });
  40. System.out.println(String.format("所有线程都执行完毕:%s", resultList));
  41. }

输出:

  1. 线程1准备好了
  2. 线程0准备好了
  3. 线程2准备好了
  4. 线程4准备好了
  5. 线程6准备好了
  6. 线程8准备好了
  7. 线程5准备好了
  8. 线程9准备好了
  9. 线程7准备好了
  10. 线程3准备好了
  11. 线程1执行完毕!
  12. 线程3执行完毕!
  13. 线程2执行完毕!
  14. 线程0执行完毕!
  15. 线程4执行完毕!
  16. 线程5执行完毕!
  17. 线程6执行完毕!
  18. 线程7执行完毕!
  19. 线程9执行完毕!
  20. 线程8执行完毕!
  21. 所有线程都执行完毕:[result1, result3, result2, result0, result4, result5, result6, result7, result9, result8]

与CountDownLatch的区别

关于CountDownLatch和CyclicBarrier的区别,主要体现在如下几个方面:

1.底层实现机制不同,CountDownLatch基于AQS,CyclicBarrier基于ReentrantLock。

2.CountDownLatch不可重复使用,CyclicBarrier可以重复使用。

3.应用场景不同:CountDownLatch用于等待一组线程执行完毕后继续后面的操作,CyclicBarrier用于让一组线程同时到达栅栏位置才能开始执行。

【参考】

CountdownLatch和CyclicBarrier的区别使用场景与具体实现

使用Java线程同步工具类CyclicBarrier的更多相关文章

  1. Java核心知识点学习----线程同步工具类,CyclicBarrier学习

    线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发. 1 ...

  2. java线程并发工具类CyclicBarrier、CountDownLatch及Semaphore

    一.CyclicBarrier   (原文链接:http://www.studyshare.cn/blog-front/blog/index ) 1.定义 CyclicBarrier是线程并发工具类之 ...

  3. java 利用同步工具类控制线程

    前言 参考来源:<java并发编程实战> 同步工具类:根据工具类的自身状态来协调线程的控制流.通过同步工具类,来协调线程之间的行为. 可见性:在多线程环境下,当某个属性被其他线程修改后,其 ...

  4. Java多线程同步工具类之CountDownLatch

    在过去我们实现多线程同步的代码中,往往使用join().wait().notiyAll()等线程间通信的方式,随着JUC包的不断的完善,java为我们提供了丰富同步工具类,官方也鼓励我们使用工具类来实 ...

  5. Java多线程同步工具类之CyclicBarrier

    一.CyclicBarrier使用 CyclicBarrier从字面上可以直接理解为线程运行的屏障,它可以让一组线程执行到一个共同的屏障点时被阻塞,直到最后一个线程执行到指定位置,你设置的执行线程就会 ...

  6. java线程并发工具类

    本次内容主要讲Fork-Join.CountDownLatch.CyclicBarrier以及Callable.Future和FutureTask,最后再手写一个自己的FutureTask,绝对干货满 ...

  7. Java并发——同步工具类

    CountDownLatch  同步倒数计数器 CountDownLatch是一个同步倒数计数器.CountDownLatch允许一个或多个线程等待其他线程完成操作. CountDownLatch对象 ...

  8. Java多线程同步工具类之Semaphore

    Semaphore信号量通常做为控制线程并发个数的工具来使用,它可以用来限制同时并发访问资源的线程个数. 一.Semaphore使用 下面我们通过一个简单的例子来看下Semaphore的具体使用,我们 ...

  9. Java多线程——其他工具类CyclicBarrier、CountDownLatch和Exchange

    CyclicBarrier 适用于:创建一组任务,它们并行地执行任务,然后在进行下一个步骤之前等待,直至所有任务完成.它使得所有的并行任务都将在栅栏处列队,因此可以一致地向前移动. 表示大家彼此等待, ...

  10. JDK5新特性之线程同步工具类(三)

    一. Semaphore Semaphore能够控制同一时候訪问资源的线程个数, 比如: 实现一个文件同意的并发訪问数. Semaphore实现的功能就类似厕全部5个坑, 增加有十个人要上厕所, 那么 ...

随机推荐

  1. [转帖]TiDB系统调参实战经验

    https://tidb.net/blog/c9466c40#TiDB%E7%B3%BB%E7%BB%9F%E8%B0%83%E5%8F%82%E5%AE%9E%E6%88%98%E7%BB%8F%E ...

  2. [转帖]perf学习-linux自带性能分析工具

    目前在做性能分析的事情,之前没怎么接触perf,找了几篇文章梳理了一下,按照问题的形式记录在这里. 方便自己查看.   什么是perf? linux性能调优工具,32内核以上自带的工具,软件性能分析. ...

  3. [转帖]如何在KingbaseES数据库查看数据库和表的大小

    关键字 kingbaseES,数据库大小,表大小 1.查看单个数据库的大小 使用ksql连接到数据库,使用sys_database_size函数 kapp=# select sys_database_ ...

  4. [转帖][minio]挂载minio到本地

    https://www.cnblogs.com/XY-Heruo/p/16489190.html 前言 将minio的bucket挂载到本地文件系统 环境 客户端系统版本:centos 7 MinIO ...

  5. [转帖]jmeter线程组与循环次数的区别

    在压测的时候,有些接口需要携带登录信息,但是我们只想登录一次,然后其他接口进行多用户压测,此时你会怎么办?用仅一次控制器实现吗?下面我们来看看用仅一次控制器能不能实现 压测时jmeter中的线程数是模 ...

  6. [转帖]Linux—编写shell脚本操作数据库执行sql

    Linux-编写shell脚本操作数据库执行sql Hughman关注IP属地: 北京 0.0762020.03.20 09:02:13字数 295阅读 1,036 修改数据库数据   在升级应用时, ...

  7. [转帖]configure: error: cannot guess build type;you must specify one

    该问题一般出现在国产平台,从错误描述来看,意思是:无法猜测build类型,你必须指定一个. 解决办法: 1. 在系统/usr路径下搜索 config.guess 和 config.sub 这两个文件. ...

  8. [转帖]Linux系统下cpio命令详解

    简介 cpio主要是解压或者将文件压缩到指定文件中即copy-in和copy-out模式. 参数说明 参数 参数说明 -i copy-in模式,解压文件 -o copy-out模式,即压缩文件 -d ...

  9. C++ CryptoPP使用RSA加解密

    Crypto++ (CryptoPP) 是一个用于密码学和加密的 C++ 库.它是一个开源项目,提供了大量的密码学算法和功能,包括对称加密.非对称加密.哈希函数.消息认证码 (MAC).数字签名等.C ...

  10. Rsync+Inotify 实现数据同步

    Rsync 是UNIX及类UNIX-Like平台下一款强大的数据镜像备份软件,它不像FTP或其他文件传输服务那样需要进行全备份,Rsync 可以根据数据的变化进行差异备份,从而减少数据流量,提高工作效 ...