• 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. [JAVA] Tcp客户端和服务器简单代码

    服务器: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; im ...

  2. .net后台转json数据

    List<PostInfo> list = new List<PostInfo>();PostInfo postinfo = new PostInfo();list.Add(p ...

  3. php 命令行脚本运行php文件简单演示

    众说周知,php在web服务器领域有着很重要的角色,可是它不仅仅在web领域,只是在web领域表现更为优秀! 它基本有三种用途: web服务端脚本的编写 应用程序图形界面(类似windows自带的计算 ...

  4. SQL 判断数据库是否有相关表 字段

    --判断数据库是否有相关表 if exists (select 1 from sysobjects where id = object_id(' 表名 ') and type = ' U ' ); - ...

  5. Mysql修改字段类型

    mysql 修改字段长度 alter table news  modify column title varchar(130); alter table 表名 modify column 字段名 类型 ...

  6. 375. 猜数字大小 II leetcode java

    题目: 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字. 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了. 然而,当你猜了数字 x 并且猜错 ...

  7. 73. 矩阵置零 leetcode JAVA

    题目: 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [   [1,1,1],   [1,0,1],   [1,1,1] ...

  8. “全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. SQL Server IF Exists 判断数据库对象是否存在的用法

    1 判断数据库是否存在Sql代码 if exists (select * from sys.databases where name = ’数据库名’)    drop database [数据库名] ...

  10. WEB H5 JS QRCode二维码快速自动生成

    万能的GITHUB: https://github.com/davidshimjs/qrcodejs HTML: <div class="col-xs-10 col-xs-offset ...