多线程编程(四)-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高并发编程相 ...
随机推荐
- Android-FileIOUtils工具类
文件读写相关工具类 public final class FileIOUtils { private FileIOUtils() { throw new UnsupportedOperationExc ...
- Buffer Pool--内存总结1
物理地址空间是处理器用来访问位于总线上的所有部件的集合.在32位处理器上,地址总线为32位,寻址空间为4GB.在使用PAE的32位服务器上,地址总线为36位,寻址空间为64GB.在64位的处理器上生产 ...
- JPA_映射双向多对多的关联关系(转)
双向多对多的关联关系 转自(http://www.cnblogs.com/lj95801/p/5011537.html) 双向多对多的关联关系(抽象成A-B)具体体现:A中有B的集合的引用,同时B中也 ...
- @JoinColumn 详解
1. 一对一 现假设有Person表和Address表,是一对一的关系,在Person中有一个指向Address表主键的字段addressID,所以主控方一定是Person,所谓主控方就是能改变关联关 ...
- 【OCP新题库】052最新题库解析-第5题
5.Which two affect the time taken for instance recovery? A) size of redo logs B) size of UNDO tables ...
- docker安装配置
########################################## #docker安装配置 #环境centos7 #配置docker阿里源 echo '#Docker [docker ...
- LOJ#2015. 「SCOI2016」妖怪(凸包)
传送门 首先可以把每个妖怪看成二维平面上的一个点,那么每一个环境\((a,b)\)就可以看成一条斜率\(k=-\frac{b}{a}\)的过该点的直线,战斗力就是这条直线在两坐标轴上的截距之和 对于每 ...
- 打开SQL Server2000企业管理器时候提示“MMC 无法创建管理单元 ”
今天上午在打开SQL Server 2000 企业管理器时候提示“MMC 无法创建管理单元”错误.
- [HTML] 模板的用法
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta na ...
- Java Web 热部署
热部署有多种方案,下面的方案是其中的一种. 暂时还没找到一种令人满意的方案. 1,配置WEB Server 去这里 (https://tomcat.apache.org/download-90.cgi ...