• 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. 多线程编程<四>

    1 /** 2 * 守护线程daemon['diːmən] 3 * @author Administrator 4 * 5 */ 6 public class DaemonDemo { 7 publi ...

  2. python 多线程编程

    这篇文章写的很棒http://blog.csdn.net/bravezhe/article/details/8585437 使用threading模块实现多线程编程一[综述] Python这门解释性语 ...

  3. Python:使用threading模块实现多线程编程

    转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...

  4. 5天玩转C#并行和多线程编程 —— 第四天 Task进阶

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

  5. Java多线程编程(四)—浅谈synchronized与lock

    一.共享资源竞争问题 在Java语言的并发编程中,由于我们不知道线程实际上在何时运行,所以在实际多线程编程中,如果两个线程访问相同的资源,那么由于线程运行的不确定性便会在这种多线程中产生访问错误.所以 ...

  6. Java多线程编程实战指南(核心篇)读书笔记(四)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  7. iOS多线程编程(四)------ GCD(Grand Central Dispatch)

    一.简单介绍 是基于C语言开发的一套多线程开发机制.也是眼下苹果官方推荐的多线程开发方法.用起来也最简单.仅仅是它基于C语言开发,并不像NSOperation是面向对象的开发.而是全然面向过程的.假设 ...

  8. C#多线程编程系列(四)- 使用线程池

    目录 1.1 简介 1.2 在线程池中调用委托 1.3 向线程池中放入异步操作 1.4 线程池与并行度 1.5 实现一个取消选项 1.6 在线程池中使用等待事件处理器及超时 1.7 使用计时器 1.8 ...

  9. Java多线程编程实战指南(核心篇)读书笔记(三)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

随机推荐

  1. log4j打印MyBatis的sql语句配置

    log4j.rootLogger=DEBUG,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender. ...

  2. [Erlang34]erlang.mk的源码阅读1-入门makefile

    通过erlang.mk项目,掌握基本的makefile语法,可以自己定制makefile. 1. makefile 基本规则: 1. 所有的源文件没有被编译过,则对各个源文件进行编译并进行链接,生成最 ...

  3. win10 数字许可证激活被 KMS激活覆盖

    打开cmd(管理员身份),依次执行以下命令: slmgr/upk slmgr/ckms slmgr/rearm 重启设备后联网登录Microsoft账号,转设置-激活-疑难解答,windows会找到与 ...

  4. c# 调用微信小程序

    //微信也不给个c#调用的例子 只好自己造咯:ps:大佬勿喷 1 public string GetWx(string code, string iv, string encryptedData) { ...

  5. sql查询优化--数字转换字符串字段

    SELECT top 1 pt.* FROM t1where id='20180731223014' SELECT top 1 pt.* FROM t1where id='0180731223014 ...

  6. 1、ASP.NET Core2.0之Model、View、Controller

    一.新建空项目 打开VS2017,新建→项目,选择如下: 点击,确定,弹出的界面选择如下: 选择空项目,因为选择其他的话会自动生成很多用不到的类,显得项目不够“清爽”,ASP.NET Core选择2. ...

  7. Ubuntu 安装java 1.8

    1.下载java 1.8 地址: ​ http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...

  8. Linux下MySQL数据库的备份与还原

    昨天对公司数据库进行备份.用了以下的方法一. 导出1.导出数据和表结构: mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql 如果要导出数据库全部: mysqldump - ...

  9. Hibernate 干货2

    @ORM框架 对象关系映射,用于实现面向对象编程语言里不同系统的数据之间的转换 @实例public void demo01(){  User user = new User();  user.setU ...

  10. AngularJS源码解析4:Parse解析器的详解

    $ParseProvider简介 此服务提供者也是angularjs中用的比较多的,下面我们来详细的说下这个provider. function $ParseProvider() { var cach ...