七、都做好了了就一起执行-CyclicBarrier
在文章(6)中我们谈到一个现象,就是做一道菜有时候是会分出多个工序进行的,当每个工序做好了之后那到菜才能相应的被做出来。文章(6)使用的是CountDownLatch,是通过线程间调用倒数的机制实现线程间的交流通知的,而今天学习到的CyclicBarrier作用类似于CountDownLatch,但CyclicBarrier没有倒数机制。
CyclicBarrier按字面的意思理解就是循环栅栏,它的作用机制是这样的,它可以定义一个阀限定线程数比如为2。给出两条线程,线程里面执行代码区域调用栅栏的await方法,相当于给代码区画了一条线,当这两条线程中任意一方先执行到抵达await方法时,会进行等待,直到两条线程都执行抵达await方法时,两者才能共同继续向下执行。
CyclicBarrier给出两个构造函数

CyclicBarrier(int parties) 创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动 barrier 时执行预定义的操作。
CyclicBarrier(int parties, Runnable barrierAction) 创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。

第二个方法与第一个方法区别在于可以传入一个Runnable作为启动栅栏时的操作,即当所有线程都达到栅栏点时,会先调用该Runnable执行之后所有其他线程才继续往下执行,下面根据代码了解一下具体的作用。

public class CyclicBarrierTest {public static void main(String[] args) {CyclicBarrier valve = new CyclicBarrier(2, new Runnable() {@Overridepublic void run() {System.out.println("各道工序准备好了,制作肠粉");}});Thread caiOffer = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("准备" + "白菜");try {Thread.sleep(4000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("白菜准备好了,等待中");try {valve.await();} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}System.out.println("白菜师傅" + "工作结束");}});Thread fenOffer = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("准备" + "粉皮");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("粉皮准备好了,等待中");try {valve.await();} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}System.out.println("粉皮师傅" + "工作结束");}});fenOffer.start();caiOffer.start();}
}

结果:

准备粉皮
准备白菜
白菜准备好了,等待中
粉皮准备好了,等待中
各道工序准备好了,制作肠粉
粉皮师傅工作结束
白菜师傅工作结束

由上面的结果可以看出,“粉皮师傅”与“白菜师傅”是同时开始作业的,但是“白菜师傅”工作比“粉皮师傅”工作先手完成,然后“白菜师傅”进行等待,等待“粉皮师傅”完成工作之后再一齐往下执行。两个师傅同时完成工作时,传入到循环栅栏构造器里面的Runnable被触动,会在两个“师傅”完成剩下工作前执行调用,所以会先出现“各道工序准备好了,制作肠粉”等句式。
在demo的过程中假设CyclicBarrier valve = new CyclicBarrier(2),但此时只有一个线程调用await方法,那么该线程会一直等待,因为没有另一个线程执行await,所以这里构造栅栏定义线程数的时候线程量一定要与执行的线程量相等或执行线程量是定义线程数的倍数,否则程序将会不断等待。

一心多用多线程-阻塞队列(7)-CyclicBarrier相关推荐

  1. 一心多用多线程-阻塞队列(5)-CountDownLatch

    五.倒数执行机制-CountDownLatch Latch:门闩的意思.根据该类名的意思,我们就可以知道该类在多线中扮演的就是一个倒数门闩的角色,怎么理解呢? 首先呢,我们新建一个CountDownL ...

  2. java多线程-阻塞队列BlockingQueue

    大纲 BlockingQueue接口 ArrayBlockingQueue 一.BlockingQueue接口 public interface BlockingQueue<E> exte ...

  3. java 多线程阻塞队列 与 阻塞方法与和非阻塞方法

    Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...

  4. 一心多用多线程-线程池ThreadPoolExecutor-看这篇就够了

    许久之前理解了java线程池ThreadPoolExecutor,今天来做一个总结,根据java api加上自己的理解,让我们能更透彻的理解java线程池 首先先写一下线程池的概念: 线程池:线程池是 ...

  5. java多线程阻塞队列_阻塞队列和多线程消费者,如何知道何时停止

    我有一个单线程生成器,它创建一些任务对象,然后添加到 ArrayBlockingQueue (具有固定大小) . 我也开始了一个多线程的消费者 . 这是一个固定的线程池( Executors.newF ...

  6. 一心多用多线程-线程的生命周期

    想起前段时间做校招的时候经常会被问到线程的生命周期问题,现在结合api做一下归纳 1.新建状态 new Thread() 创建一个线程,现在的线程并没有具备运动能力的,可以想象你新建了一只兔子,但是这 ...

  7. 一心多用多线程-细谈java线程池submit与execute的区别

    深夜学习,发现ThreadPoolExecutor里面一个小知识点,故开热点连wifi怒写submit与execute方法的区别. 1.问题的来源 在看书的时候,涉及到java线程池问题的时候常常面临 ...

  8. 一心多用多线程-future-java线程中的异步执行

    经历了一波校招,实习,回到学校了,宿舍没网懒得来实验室也导致自己少写了几篇自己总结的技术博客. 现在来讲讲这两天了解到的java线程中future模式. 在web开发中,我们在静态网页中使用ajax可 ...

  9. 多线程 阻塞队列中的poll与take区别

    https://blog.csdn.net/qiuchaoxi/article/details/80359462

最新文章

  1. 操作系统的八股文自述(持续更新)
  2. Windows文件系统过滤驱动开发教程(4,5)
  3. 如何在 CentOS 上启用 软件集 Software Collections(SCL)
  4. mysql主从异步复制_centos7mysql主从复制(默认异步)
  5. JAVA子类是球父类是圆_java的父类和子类,这是矛盾...
  6. android按钮响应事件吗,Android 按钮响应事件的几种方式
  7. BZOJ1354: [Baltic2005]Bus Trip
  8. 编码的奥秘:自动操作
  9. 我们建立数据中心,需要考虑哪些问题?
  10. EMD 经验模态分解
  11. 英文原始文本的读取与处理
  12. AD软件——把原理图库 和 PCB元件库封装模型 关联起来
  13. 在c#中using和new这两个关键字有什么意义
  14. 萌新linux的基础笔记
  15. 谈PWM和CPU风扇
  16. 中国56个民族sql语句
  17. Java规则引擎工作原理及其应用
  18. SYU新人提高90题1(基础题)
  19. 字符串(字节)长度计算
  20. 更智能!AIRIOT加速煤炭行业节能减排升级

热门文章

  1. 赛道持续降温!又一家自动驾驶公司裁员,市值曾超50亿美元
  2. 安卓,运维,大数据,前端,java,区块链学习路线
  3. Linux - vi命令编辑后 wq 与 x 区别是什么?
  4. Windows 系统中添加防火墙规则
  5. 系统CPU负载过高、CPU使用率不高的问题
  6. Conv2Former ~2
  7. win10消息推送服务器,推送--Win10系统 - Win10系统官方网站
  8. c语言程序中,整型常量的书写形式不包括_________.,??C语言程序中,整型常量的书写形式不包括_________。????...
  9. 【计算机网络】第三部分 数据链路层(11) 数据链路控制
  10. 两个八进制小数怎么相加_组成原理中关于小数和整数关于十,二,十六,八进制之间任意的转换...