多线程编程(四)-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高并发编程相 ...
随机推荐
- asp.net 使用Oracle数据库
asp.net下使用oracle会发生“未能加载文件或程序集‘Oracle.DataAccess’或它的某一个依赖项”的错误.这说明Oracle的驱动没有安装好,或者版本不对的错误. 1.检查Orac ...
- window系统JAVA开发环境的搭建
1.java JSK工具包安装教程http://www.runoob.com/java/java-environment-setup.html 2.Eclipase编辑器安装包教程 http://ww ...
- 知识记录——CSS规范(文章内容为转载)
原作者信息 作者:词晖 链接:http://www.zhihu.com/question/19586885/answer/48933504 来源:知乎 著作权归原作者所有,转载请联系原作者获得授权. ...
- 如何将JPG格式的图片转化为带地理坐标的TIFF格式
最近有个项目需要用到开源软件GeoServer,数据源是一张高分辨率的2.5维图片,格式是jpg的,由于GeoServer不支持jpg格式的发布,因此考虑到要进行格式转换,将其转换成tiff格式. 1 ...
- Android Preferences: How to load the default values when the user hasn't used the preferences-screen?
在启动 preferences 之前,默认值并不能生效.第一次运行程序时候,默认值没生效,然后获取的 preferences 的值就是错误的. 解决办法是在程序开始时加一行代码使默认值生效. Pref ...
- java—数据存储过程 (54)
存储过程:procedure:就是一段可执行程序.这个程序运行在数据中. Begin = { End = } If Else 也可以接收参数. 1 定义一个procedure: CREATE PROC ...
- jquery改造轮播图1
g改造轮播图1:https://www.cnblogs.com/huanghuali/p/8677338.html <!DOCTYPE html> <html lang=" ...
- “全栈2019”Java多线程第七章:等待线程死亡join()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 我把阿里云centos gcc从4.4.7升级到4.8.2的经历
我有试着去手动编译安装gcc,可是make的速度实在太慢,最后还直接失败了. 最后在csdn找到了个博客,说是使用yum来安装,网址为: http://blog.csdn.net/ppdouble/a ...
- python --爬虫基础 --爬取今日头条 使用 requests 库的基本操作, Ajax
'''思路一: 由于是Ajax的网页,需要先往下划几下看看XHR的内容变化二:分析js中的代码内容三:获取一页中的内容四:获取图片五:保存在本地 使用的库1. requests 网页获取库 2.fro ...