CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier默认的构造方法是

CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。

cBarrierTest {public static void main(String[] args) {ExecutorService service = Executors.newCachedThreadPool();final CyclicBarrier cb = new CyclicBarrier(3);//约定三个人同时到达for (int i = 0; i < 3; i++) {Runnable runnable = new Runnable() {public void run() {try {Thread.sleep((long) (Math.random() * 10000));System.out.println("线程" + Thread.currentThread().getName() +"即将到达集合地点1,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" : "正在等候"));cb.await();//三个同时线程的时候才往下走
Thread.sleep((long) (Math.random() * 10000));System.out.println("线程" + Thread.currentThread().getName() +"即将到达集合地点2,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" : "正在等候"));cb.await();Thread.sleep((long) (Math.random() * 10000));System.out.println("线程" + Thread.currentThread().getName() +"即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" : "正在等候"));cb.await();} catch (Exception e) {e.printStackTrace();}}};service.execute(runnable);}service.shutdown();}
}

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class CountdownLatchTest {public static void main(String[] args) {ExecutorService service = Executors.newCachedThreadPool();final CountDownLatch cdOrder = new CountDownLatch(1);final CountDownLatch cdAnswer = new CountDownLatch(3);for (int i = 0; i < 3; i++) {Runnable runnable = new Runnable() {public void run() {try {System.out.println("线程" + Thread.currentThread().getName() +"正准备接受命令");cdOrder.await();//三个线程同时进来接受命令//调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行System.out.println("线程" + Thread.currentThread().getName() +"已接受命令");Thread.sleep((long) (Math.random() * 10000));System.out.println("线程" + Thread.currentThread().getName() +"回应命令处理结果");cdAnswer.countDown();} catch (Exception e) {e.printStackTrace();}}};service.execute(runnable);}try {Thread.sleep((long) (Math.random() * 10000));System.out.println("线程" + Thread.currentThread().getName() +"即将发布命令");cdOrder.countDown();//这里等于0之后触发了wait事件让其往下执行System.out.println("线程" + Thread.currentThread().getName() +"已发送命令,正在等待结果");cdAnswer.await();//调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
System.out.println("线程" + Thread.currentThread().getName() +"已收到所有响应结果");} catch (Exception e) {e.printStackTrace();}service.shutdown();}
}

转载于:https://www.cnblogs.com/tinya/p/8452808.html

java并发之同步辅助类CyclicBarrier和CountDownLatch相关推荐

  1. 16_张孝祥_多线程_同步工具CyclicBarrier与CountDownLatch

    转载: CyclicBarrier的用法 CountDownLatch(倒计时计数器)使用说明 参考: CyclicBarrier和CountDownLatch区别 CyclicBarrier Cyc ...

  2. 线程同步辅助类CyclicBarrier

    CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用. 集合点同步:CyclicBarrier 多条线程同时执行一个阶段性任务时,相互等待,等到最后一个线程执行完阶段后,才 ...

  3. Java并发之同步的产生及解决

    同步问题的产生 由于Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时,就会有相互冲突而导致的数据不准确问题. 卖火车票案例 public class Ticket implemen ...

  4. CountDownLatch,同步辅助类

    public class CountDownLatchextends Object一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 假设定义一个计数器为 5. 每 ...

  5. Java的几个同步辅助类

    Java为我们提供了一些同步辅助类,利用这些辅助类我们可以在多线程编程中,灵活地把握线程的状态. CountDownLatch CountDownLatch一个同步辅助类,在完成一组正在其他线程中执行 ...

  6. Java中的5种同步辅助类

    当你使用synchronized关键字的时候,是通过互斥器来保障线程安全以及对共享资源的同步访问.线程间也经常需要更进一步的协调执行,来完成复杂的并发任务,比如wait/notify模式就是一种在多线 ...

  7. Java并发编程之CyclicBarrier和CountDownLatch

    1.CyclicBarrier简介 CyclicBarrier(栅栏):拦截一组线程并使其阻塞,直到其内部的计数器归零,再唤醒所有的阻塞线程继续执行任务. 基础属性 public class Cycl ...

  8. Java多线程学习三十五: CyclicBarrier 和 CountDownLatch 有什么不同

    CyclicBarrier 和 CountDownLatch 有什么不同? CyclicBarrier作用 CyclicBarrier 和 CountDownLatch 确实有一定的相似性,它们都能阻 ...

  9. CyclicBarrier和CountDownLatch区别

    这两天写多线程时,用到了CyclicBarrier,下意识的认为CyclicBarrier和CountDownLatch作用很像,就翻阅资料查了一下,说一下他们的区别吧 CyclicBarrier和C ...

最新文章

  1. 在GNS3中模拟交换机和PC
  2. Eliminate Witches!【2011年北京赛区正赛赛题-2】
  3. Maven打包时去掉项目版本号
  4. html中内联元素和块级元素的区别(整理版)
  5. java uml eclipse_eclipse uml 工具
  6. 4位格雷码的顺序编码_能通俗地讲解一下格雷码的编码规则吗?
  7. mysql kingshard_浅谈 Kingshard MySQL 中间件
  8. WebComponent魔法堂:深究Custom Element 之 从过去看现在
  9. HTML DOM学习
  10. css中用于设置首行文本缩进的属性是,css中设置段落缩进的属性是什么
  11. 数学与计算机学院女生节标语,3.7女生节标语
  12. B站左程云算法视频高级班02
  13. QCC302X/QCC303X蓝牙对讲与蓝牙扩音器
  14. xshell上传文件到Linux
  15. 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(1)
  16. 虚拟机NAT模式无法上网
  17. mac虚拟机搭建设置静态ip
  18. STM32CUBEIDE使用说明
  19. 网易2018校园招聘:射击游戏 [python]
  20. 体验高空跳伞,3DMark Sky Drive场景测试

热门文章

  1. java 泛型对象实例化_在java中实例化泛型类型
  2. C++为什么空格无法输出_数据的输入输出举例
  3. 为啥我从后台查到的值在页面显示的是undefined_再谈一个管理后台列表功能应有的素质...
  4. Java项目:教务管理系统(java+JSP+Spring+SpringBoot+layui+maven)
  5. Java项目:房屋租赁系统设计和实现(java+ssm+mysql+spring+jsp)
  6. 河科大c语言上机实验答案,2016年河南科技学院信息工程学院C语言上机编程考研复试题库...
  7. c语言——求单词个数
  8. ios .framework动态库重签名
  9. js回调函数和函数带参数的使用示例
  10. iOS NSObject对象内存大小