多线程编程(四)-CyclicBarrier的使用
- CyclicBarrier的介绍
类CyclicBarrier不仅有CountDownLatch所具有的功能,还可以是啊县屏障等待的功能,也就是阶段性同步,它在使用上的意义在与可以循环地实现线程要一起做任务的目标,而不是像类CountDownLatch一样,仅仅支持一次线程与同步点阻塞的特性。
CyclicBarrier与CountDownLatch的区别:
1、CountDownLatch是一个线程或者多个线程,等待两一个线程或者多个线程完成某件事情之后才能继续执行。
2、CyclicBarrier是指多个线程之间互相等待,任何一个线程完成之前,所有的线程都必须等待。
- 实例
模拟田径比赛的CyclicBarrier版本
package com.wjg.unit_2_2_1; import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; public class Run {
public static void main(String[] args) throws InterruptedException {
CyclicBarrier barrier = new CyclicBarrier(10, new Runnable() {
@Override
public void run() {
System.out.println("全部准备就绪!");
}
});
Run run = new Run();
for (int i = 0; i < barrier.getParties(); i++) {
MyThread thread = run.new MyThread(barrier);
thread.setName("运动员"+(i+1));
thread.start();
} } public class MyThread extends Thread{
private CyclicBarrier barrier; public MyThread(CyclicBarrier barrier) {
super();
this.barrier = barrier;
} @Override
public void run() { try {
Thread.sleep((int)Math.random()*1000);
System.out.println(this.getName()+"到了");
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
} } }
}
执行结果:
运动员1到了
运动员2到了
运动员3到了
运动员4到了
运动员5到了
运动员6到了
运动员7到了
运动员10到了
运动员9到了
运动员8到了
全部准备就绪!
- 模拟篮球场的3V3接波场景
package com.wjg.unit_2_2_1; import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; public class Run {
public static void main(String[] args) throws InterruptedException {
CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {
@Override
public void run() {
System.out.println("3人小队组队完毕,可以接波了");
}
});
Run run = new Run();
for (int i = 0; i < 9; i++) {
MyThread thread = run.new MyThread(barrier);
thread.setName("玩家"+(i+1));
thread.start();
} } public class MyThread extends Thread{
private CyclicBarrier barrier; public MyThread(CyclicBarrier barrier) {
super();
this.barrier = barrier;
} @Override
public void run() { try {
Thread.sleep((int)Math.random()*1000);
System.out.println(this.getName()+"到达球场,等待凑齐三人");
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
} } }
}
执行结果:
玩家2到达球场,等待凑齐三人
玩家5到达球场,等待凑齐三人
玩家4到达球场,等待凑齐三人
3人小队组队完毕,可以接波了
玩家3到达球场,等待凑齐三人
玩家1到达球场,等待凑齐三人
玩家6到达球场,等待凑齐三人
3人小队组队完毕,可以接波了
玩家7到达球场,等待凑齐三人
玩家8到达球场,等待凑齐三人
玩家9到达球场,等待凑齐三人
3人小队组队完毕,可以接波了
- 方法getNumerWaiting()
此方法的作用是获得由几个线程已经到达了屏障点。
- 方法isBroken()
查询此屏障是否处于损坏状态,比如其中一个线程执行抛出了异常。则isBroken为true。
- 方法await(long timeout,TimeUnit unit)
如果在执行的时间内达到parties的数量,则程序继续往下运行,否如如果出现超市,则抛出TimeoutException异常。
- 方法getParties()
此方法作用是获得parties的个数。
- 方法reset()
此方法作用是重置屏障,如果已经处于等待的线程会抛出BrokenBarrierException异常。
多线程编程(四)-CyclicBarrier的使用的更多相关文章
- 多线程编程<四>
1 /** 2 * 守护线程daemon['diːmən] 3 * @author Administrator 4 * 5 */ 6 public class DaemonDemo { 7 publi ...
- python 多线程编程
这篇文章写的很棒http://blog.csdn.net/bravezhe/article/details/8585437 使用threading模块实现多线程编程一[综述] Python这门解释性语 ...
- Python:使用threading模块实现多线程编程
转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...
- 5天玩转C#并行和多线程编程 —— 第四天 Task进阶
5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...
- Java多线程编程(四)—浅谈synchronized与lock
一.共享资源竞争问题 在Java语言的并发编程中,由于我们不知道线程实际上在何时运行,所以在实际多线程编程中,如果两个线程访问相同的资源,那么由于线程运行的不确定性便会在这种多线程中产生访问错误.所以 ...
- Java多线程编程实战指南(核心篇)读书笔记(四)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- iOS多线程编程(四)------ GCD(Grand Central Dispatch)
一.简单介绍 是基于C语言开发的一套多线程开发机制.也是眼下苹果官方推荐的多线程开发方法.用起来也最简单.仅仅是它基于C语言开发,并不像NSOperation是面向对象的开发.而是全然面向过程的.假设 ...
- C#多线程编程系列(四)- 使用线程池
目录 1.1 简介 1.2 在线程池中调用委托 1.3 向线程池中放入异步操作 1.4 线程池与并行度 1.5 实现一个取消选项 1.6 在线程池中使用等待事件处理器及超时 1.7 使用计时器 1.8 ...
- Java多线程编程实战指南(核心篇)读书笔记(三)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
随机推荐
- MSP430 G2553 计时/计数器 Timer_A
MSP430G2553包含了两个16-bit Timer_A计时/计数器.本文简单介绍了Timer_A的功能和寄存器使用,本文及后续的随笔部分参考了"Scientific Instrumen ...
- solr特点一:高亮(highlighting)
高亮的配置 参数详细说明: hl.fl: 用空格或逗号隔开的字段列表.要启用某个字段的highlight功能,就得保证该字段在schema中是stored.如果该参数未被给出,那么就会高亮默认字段 s ...
- 使用Toolbar + DrawerLayou实现菜单侧滑,改变toolbar左上角图标
侧边栏具体实现可以参照http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0303/2522.html getSupportActio ...
- vs2008安装mvc3后新建项目报错 -- 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
解决方案: 找到主目录的.csproj文件,用文字编辑器打开你找到它找到 <Reference Include="System.Web.WebPages" /> &l ...
- .NetCore分布式部署中的DataProtection密钥安全性
在.NetCore中默认使用DataProtection来保护数据,例如Cooike等.一般情况下DataProtection生成的密钥会被加密后存储,例如默认的文件存储 可以看到使用了Windows ...
- 微信小程序开发中的二三事之网易云信IMSDK DEMO
本文由作者邹永胜授权网易云社区发布. 简介 为了更好的展示我们即时通讯SDK强悍的能力,网易云信IM SDK微信小程序DEMO的开发就提上了日程.用产品的话说就是: 云信 IM 小程序 SDK 的能力 ...
- [JS] 四角度旋转特效
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- [Swift实际操作]八、实用进阶-(1)Swift语言中的两种单例模式实际操作
本文降温你解析常见的单例模式.单例模式可以保证一个类仅有一个实例,同时这个类还必须提供一个访问该类的全局访问点. 首先导入需要使用到的界面工具框架 import UIKit 单例对象保证了只有一个实例 ...
- [CISCO] 简单配置 Telnet 服务
[CISCO] 简单配置 Telnet 服务 一.Introduction Telnet 协议是一种应用层协议,使用于网际网路及区域网中,使用虚拟终端机的形式,提供双向.以文字字串为主的互动功能.属于 ...
- 谷歌将对欧洲 Android 设备制造商收取其应用服务费用
简评:欧盟就谷歌违反了<反垄断法>开出天价罚单,导致谷歌运营生态被打破,为了配合这一裁决,谷歌将调整其运营模式.欧盟似乎赢了,而这最后买单的却是消费者. 今年七月份,谷歌要求 Androi ...