java并发之同步辅助类CyclicBarrier和CountDownLatch
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相关推荐
- 16_张孝祥_多线程_同步工具CyclicBarrier与CountDownLatch
转载: CyclicBarrier的用法 CountDownLatch(倒计时计数器)使用说明 参考: CyclicBarrier和CountDownLatch区别 CyclicBarrier Cyc ...
- 线程同步辅助类CyclicBarrier
CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用. 集合点同步:CyclicBarrier 多条线程同时执行一个阶段性任务时,相互等待,等到最后一个线程执行完阶段后,才 ...
- Java并发之同步的产生及解决
同步问题的产生 由于Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时,就会有相互冲突而导致的数据不准确问题. 卖火车票案例 public class Ticket implemen ...
- CountDownLatch,同步辅助类
public class CountDownLatchextends Object一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 假设定义一个计数器为 5. 每 ...
- Java的几个同步辅助类
Java为我们提供了一些同步辅助类,利用这些辅助类我们可以在多线程编程中,灵活地把握线程的状态. CountDownLatch CountDownLatch一个同步辅助类,在完成一组正在其他线程中执行 ...
- Java中的5种同步辅助类
当你使用synchronized关键字的时候,是通过互斥器来保障线程安全以及对共享资源的同步访问.线程间也经常需要更进一步的协调执行,来完成复杂的并发任务,比如wait/notify模式就是一种在多线 ...
- Java并发编程之CyclicBarrier和CountDownLatch
1.CyclicBarrier简介 CyclicBarrier(栅栏):拦截一组线程并使其阻塞,直到其内部的计数器归零,再唤醒所有的阻塞线程继续执行任务. 基础属性 public class Cycl ...
- Java多线程学习三十五: CyclicBarrier 和 CountDownLatch 有什么不同
CyclicBarrier 和 CountDownLatch 有什么不同? CyclicBarrier作用 CyclicBarrier 和 CountDownLatch 确实有一定的相似性,它们都能阻 ...
- CyclicBarrier和CountDownLatch区别
这两天写多线程时,用到了CyclicBarrier,下意识的认为CyclicBarrier和CountDownLatch作用很像,就翻阅资料查了一下,说一下他们的区别吧 CyclicBarrier和C ...
最新文章
- 在GNS3中模拟交换机和PC
- Eliminate Witches!【2011年北京赛区正赛赛题-2】
- Maven打包时去掉项目版本号
- html中内联元素和块级元素的区别(整理版)
- java uml eclipse_eclipse uml 工具
- 4位格雷码的顺序编码_能通俗地讲解一下格雷码的编码规则吗?
- mysql kingshard_浅谈 Kingshard MySQL 中间件
- WebComponent魔法堂:深究Custom Element 之 从过去看现在
- HTML DOM学习
- css中用于设置首行文本缩进的属性是,css中设置段落缩进的属性是什么
- 数学与计算机学院女生节标语,3.7女生节标语
- B站左程云算法视频高级班02
- QCC302X/QCC303X蓝牙对讲与蓝牙扩音器
- xshell上传文件到Linux
- 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(1)
- 虚拟机NAT模式无法上网
- mac虚拟机搭建设置静态ip
- STM32CUBEIDE使用说明
- 网易2018校园招聘:射击游戏 [python]
- 体验高空跳伞,3DMark Sky Drive场景测试
热门文章
- java 泛型对象实例化_在java中实例化泛型类型
- C++为什么空格无法输出_数据的输入输出举例
- 为啥我从后台查到的值在页面显示的是undefined_再谈一个管理后台列表功能应有的素质...
- Java项目:教务管理系统(java+JSP+Spring+SpringBoot+layui+maven)
- Java项目:房屋租赁系统设计和实现(java+ssm+mysql+spring+jsp)
- 河科大c语言上机实验答案,2016年河南科技学院信息工程学院C语言上机编程考研复试题库...
- c语言——求单词个数
- ios .framework动态库重签名
- js回调函数和函数带参数的使用示例
- iOS NSObject对象内存大小