1.基本概念

中文译本同步屏障,同样来自jdk并发工具包中一个并发控制器,它的使用和CountDownLatch有点相似,能够完成某些相同并发场景,但是它们却不相同。

2.抽象模型

主要用来实现多个线程同步,同步后可能唤醒另外一个任务,然后继续执行线程后面的任务。CountDownLatch抽象模型却是一个或多个线程通知某个或多个线程,它没有同步功能。

3.使用场景

田径比赛, 虽然上一篇文章使用CountDownLatch也能实现,但是我觉得这里却使用同步屏障更简单点。

4.CyclicBarrier使用api

java new CyclicBarrier(int parties); //创建同步屏障,仅仅启动同步作用,中间没有需要执行的任务。

java new CyclicBarrier(int parties, Runnable barrierAction); //创建同步屏障,不仅同步,而且中间有任务需要执行。

java cyclicBarrier.await(); //调用一次,parties就会减1,直到变为0时,执行barrierAction任务后(配置情况下),然后执行此代码的线程才能停止阻塞,继续执行。

java ps:因为使用CyclicBarrier的线程都会阻塞在await方法上,所以在线程池中使用CyclicBarrier时要特别小心,如果线程池的线程过少,那么就会发生死锁了。

5.使用示例(田径比赛)

    public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(3);
final CyclicBarrier startBarrier = new CyclicBarrier(3, new Runnable() {
@Override
public void run() { try {
System.out.println("他们都准备好了,那就开跑吧");
System.out.println("3");
Thread.sleep(1000);
System.out.println("2");
Thread.sleep(1000);
System.out.println("1");
Thread.sleep(1000);
System.out.println("0");
System.out.println("go!!!");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
CyclicBarrier endBarrier = new CyclicBarrier(3, new Runnable() {
@Override
public void run() {
System.out.println("都到达了终点,比赛结束");
}
});
for(int i=3;i>0;i--){
final int num = i;
Runnable runnable = new Runnable() { @Override
public void run() {
try {
int time = (int)(Math.random()*1000);
Thread.sleep(time);
System.out.println("运动员" + num + "号,准备了" + time + "ms,准备结束!");
startBarrier.await();
System.out.println("运动员" + num + "号,开始跑了");
int runtime = (int)(Math.random()*10000);
Thread.sleep(runtime);
System.out.println("运动员" + num + "号,用时:" + runtime + "ms");
endBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
}
};
executor.submit(runnable);
}
}

执行结果

运动员1号,准备了580ms,准备结束!
运动员3号,准备了866ms,准备结束!
运动员2号,准备了878ms,准备结束!
他们都准备好了,那就开跑吧
3
2
1
0
go!!!
运动员2号,开始跑了
运动员1号,开始跑了
运动员3号,开始跑了
运动员2号,用时:2008ms
运动员3号,用时:5587ms
运动员1号,用时:6634ms
都到达了终点,比赛结束

6.和CountDownLatch的区别

<1>CountDownLatch能唤醒多个线程,而CyclicBarrier只能唤醒一个线程;

<2>一个线程或多个线程(A)使用CountDownLatch通知另外一个或多个线程(B),A线程之间不会有同步功能,需要多个latch才能实现同步功能;而CyclicBarrier能同步A线程组的执行步骤;

<3>CountDownLatch是一次性的,不能重置,而CyclicBarrier不是,它有reset()方法;

Java核心-多线程-并发控制器-CyclicBarrier同步屏障的更多相关文章

  1. Java核心-多线程-并发控制器-Semaphore信号量

    Semaphore是非常有用的一个多线程并发控制组件(Java还有CountDownLatch.CyclicBarrier.Exchanger多线程组件),它相当于是一个并发控制器,是用于管理信号量的 ...

  2. Java核心-多线程-并发控制器-CountDownLatch倒数闩

    1.基本概念 CountDownLatch,中文名倒数闩,jdk并发工具包中一个并发控制器,它抽象了一个常见的多线程并发场景,开发人员使用它可以写出同时兼顾线程安全性与高效率的代码. 2.抽象模型 相 ...

  3. Java核心-多线程-并发控制器-Exchanger交换器

    1.基本概念 Exchanger,从名字上理解就是交换.Exchanger用于在两个线程之间进行数据交换,注意也只能在两个线程之间进行数据交换. 线程会阻塞在Exchanger的exchange方法上 ...

  4. Java多线程之CountDownLatch和CyclicBarrier同步屏障的使用

      转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6558349.html  一:CountDownLatch CountDownLatch是一个执行 完成任务 ...

  5. java核心-多线程-Java多线程编程涉及到包、类

    Java有关多线程编程设计的类主要涉及两个包java.lang和java.util.concurrent两个包 java.lang包,主要是线程基础类 <1>Thread <2> ...

  6. Java接口多线程并发测试 (一)

    本文为作者原创,禁止转载,违者必究法律责任!!! 本文为作者原创,禁止转载,违者必究法律责任!!! Java接口多线程并发测试 一,首先写一个接口post 请求代码: import org.apach ...

  7. Java并发(十三):并发工具类——同步屏障CyclicBarrier

    先做总结 1.CyclicBarrier 是什么? CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点) ...

  8. [Java多线程]-并发,并行,synchonrized同步的用法

    一.多线程的并发与并行: 并发:多个线程同时都处在运行中的状态.线程之间相互干扰,存在竞争,(CPU,缓冲区),每个线程轮流使用CPU,当一个线程占有CPU时,其他线程处于挂起状态,各线程断续推进. ...

  9. java核心-多线程(1)-知识大纲

    Thread,整理一份多线程知识大纲,大写意 1.概念介绍 线程 进程 并发 2.基础知识介绍 Java线程类 Thread 静态方法&实例方法 Runnable Callable Futur ...

随机推荐

  1. dubbo could not get local host ip address will use 127.0.0.1 instead 异常处理

    dubbo could not get local host ip address will use 127.0.0.1 instead 查看hostname localhost:spring wls ...

  2. 强大的css3库

    http://www.html5tricks.com/demo/css3-animate-css/index.html 关注微信小程序

  3. String 和 StringBuilder

    官方解释 String  String 类代表字符串.字符串是常量:它们的值在创建之后不能更改. StringBuilder 一个可变的字符序列. 疑问 字符串是常量:它们的值在创建之后不能更改.那 ...

  4. qt 利用 HTML 生成PDF文档,不能显示jpg图片

    利用 QPrinter 和html 生成 pdf文档 其中用html语句有显示图片的语句 但只能显示png格式的图片,不能显示jpg格式图片. 经过排查:语法,文件路径等都正确,最终在stack ov ...

  5. 将数据转换成树型层级的Json格式的String

    有时候我们项目里面需要将树型关系的数据转换成Json格式的String字符串 假设数据库中的数据如下 需要转换后输出的字符串的结果如下(对应的层级的关系) [ {name:'爷爷',id:'1',co ...

  6. Composer的入门与使用

    一 什么是composer composer是一种php的包管理工具, 类似于Java的maven, Ubuntu的apt等, 可以方便的解决php的包管理, 管理依赖关系等问题. 二 使用compo ...

  7. Go爬去以太坊的价格数据

    package main import ( "encoding/json" "errors" "fmt" "io/ioutil&q ...

  8. Mysql 8.0 导入txt文件操作(课程实验)

    一.实验准备: 1.实验设备:Dell laptop 7559; 2.实验环境:windows 10操作系统; 3.数据库版本:mysql 8.0; 二.实验目的: 1.将一个宠物表pet.txt文件 ...

  9. RXJS 实例操作符

    先来了解几个新名词: Observable : 可观察对象,是一组值或事件的集合 Observer : 观察者,回调函数集合 Subscription :Observable动作执行者 Operato ...

  10. 批量找注入 python3+sqlmap结合

    注入一直都是用sqlmap  导致本来就不怎么精通的手工注入现在就忘的一干二净 想实战练习  却一时又找不到有注入的网站   于是便有了这篇文章 想找个批量获取域名链接的工具   但都是只是获取域名而 ...