CyclicBarrier(又叫障碍器)同样是Java5中加入的新特性,使用时需要导入Java.util.concurrent.CylicBarrier。它适用于这样一种情况:你希望创建一组任务,它们并发地执行工作,另外的一个任务在这一组任务并发执行结束前一直阻塞等待,直到该组任务全部执行结束,这个任务才得以执行。这非常像CountDownLatch,只是CountDownLatch是只触发一次的事件,而CyclicBarrier可以多次重用。

下面给出一个简单的实例来说明其用法:

  1. import java.util.concurrent.BrokenBarrierException;
  2. import java.util.concurrent.CyclicBarrier;
  3. public class CyclicBarrierTest {
  4. public static void main(String[] args) {
  5. //创建CyclicBarrier对象,
  6. //并设置执行完一组5个线程的并发任务后,再执行MainTask任务
  7. CyclicBarrier cb = new CyclicBarrier(5, new MainTask());
  8. new SubTask("A", cb).start();
  9. new SubTask("B", cb).start();
  10. new SubTask("C", cb).start();
  11. new SubTask("D", cb).start();
  12. new SubTask("E", cb).start();
  13. }
  14. }
  15. /**
  16. * 最后执行的任务
  17. */
  18. class MainTask implements Runnable {
  19. public void run() {
  20. System.out.println("......终于要执行最后的任务了......");
  21. }
  22. }
  23. /**
  24. * 一组并发任务
  25. */
  26. class SubTask extends Thread {
  27. private String name;
  28. private CyclicBarrier cb;
  29. SubTask(String name, CyclicBarrier cb) {
  30. this.name = name;
  31. this.cb = cb;
  32. }
  33. public void run() {
  34. System.out.println("[并发任务" + name + "]  开始执行");
  35. for (int i = 0; i < 999999; i++) ;    //模拟耗时的任务
  36. System.out.println("[并发任务" + name + "]  开始执行完毕,通知障碍器");
  37. try {
  38. //每执行完一项任务就通知障碍器
  39. cb.await();
  40. } catch (InterruptedException e) {
  41. e.printStackTrace();
  42. } catch (BrokenBarrierException e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }

某次执行的结果如下:

[并发任务A]  开始执行
[并发任务B]  开始执行
[并发任务D]  开始执行
[并发任务E]  开始执行
[并发任务A]  开始执行完毕,通知障碍器
[并发任务E]  开始执行完毕,通知障碍器
[并发任务D]  开始执行完毕,通知障碍器
[并发任务C]  开始执行
[并发任务B]  开始执行完毕,通知障碍器
[并发任务C]  开始执行完毕,通知障碍器
......终于要执行最后的任务了......

从结果可以看出:MainTask任务在一组中的5个任务执行完后才开始执行。

【Java并发编程】:并发新特性—障碍器CyclicBarrier的更多相关文章

  1. 转:【Java并发编程】之二十二:并发新特性—障碍器CyclicBarrier(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17512983 CyclicBarrier(又叫障碍器)同样是Java5中加入的新特性,使用 ...

  2. Java并发编程--5.信号量和障碍器

    Semaphore信号量 简介 它本质上是一个共享锁,限制访问公共资源的线程数目,它也被称为计数信号量acquire()许可一个线程, Semaphore – 1; 没有可用的许可时,Semaphor ...

  3. Java 多线程:并发编程的三大特性

    Java 多线程:并发编程的三大特性 作者:Grey 原文地址: 博客园:Java 多线程:并发编程的三大特性 CSDN:Java 多线程:并发编程的三大特性 可见性 所谓线程数据的可见性,指的就是内 ...

  4. JAVA JDK1.5-1.9新特性

    1.51.自动装箱与拆箱:2.枚举(常用来设计单例模式)3.静态导入4.可变参数5.内省 1.61.Web服务元数据2.脚本语言支持3.JTable的排序和过滤4.更简单,更强大的JAX-WS5.轻量 ...

  5. Java 8 正式发布,新特性全搜罗

    经过2年半的努力.屡次的延期和9个里程碑版本,甲骨文的Java开发团队终于发布了Java 8正式版本. Java 8版本最大的改进就是Lambda表达式,其目的是使Java更易于为多核处理器编写代码: ...

  6. 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  7. Java引入的一些新特性

    Java引入的一些新特性 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程, ...

  8. 使用示例带你提前了解 Java 9 中的新特性

    使用示例带你提前了解 Java 9 中的新特性 转载来源:https://juejin.im/post/58c5e402128fe100603cc194 英文出处:https://www.journa ...

  9. Java学习之==>Java8 新特性详解

    一.简介 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.Java 8是 Java 自 Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库. ...

随机推荐

  1. python 求第k个最大数

    #coding = utf-8 import sys def Cal_NO(a,b): nums=sorted(a,reverse=True) result=nums[b-1] return resu ...

  2. Google Map API申请

    https://code.google.com/apis/console 当然需要先有个Google账户登录. 然后需要建一个项目. 然后根据package+sha1码获取密钥key 然后就可以创建凭 ...

  3. IDEA14/Eclipse+Tomcat7热部署,jrebel6破解与eclipse配置

    换了最新的eclipse,以前很多的插件都用不了,对于web开发的人来说,jrebel这种防重启神器必须要配备,防止修改类名.java文件.配置文件后的tomcat重启. 首先给一个下载地址: htt ...

  4. bootstrap modal

    模态框提供了两个可选尺寸,通过为 .modal-dialog 增加一个样式调整类实现.加modal-lg,加modal-sm,不加也可以,共有三种尺寸. 触发方式,data-target, 感觉比js ...

  5. D3 drag

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 使用MTR命令诊断网络问题

      以前在检查网络时习惯使用ping命令,因为ping命令非常简单,现在喜欢上了mtr命令,因为它真的很强大,但是对于刚刚接触这个命令的同学来说,理解起来就没有ping命令来的那么直观了,所以今天写一 ...

  7. 设计模式之代理模式(Proxy Pattern)_远程代理解析

    一.什么是代理模式? 顾名思义,代理就是第三方,比如明星的经纪人,明星的事务都交给经纪人来处理,明星只要告诉经纪人去做什么,经纪人自然会想办法去做,做完之后再把结果告诉明星就好了 本来是调用者与被调用 ...

  8. 如何使用linq读取DataTable集合?AsQueryable() 和 AsEnumerable()区别?

    一.准备工作 引入linq和data 相关的using命名空间 DataTable dt=new DataTable();//dt的来源可以是多个地方,比如:数据库,Excel等等.我这里使用Exce ...

  9. LoadRunner 12下载和安装教程

    我们利用LoadRunner可以对Web应用系统进行性能压力测试,本篇博客将和大家介绍下LoadRunner 12的下载和安装,在后续的博客中将和大家介绍其使用的方法. 1.LoadRunner 12 ...

  10. 移植Max中的控制器到Unity - 前言

    一切源自于一个ppt http://pan.baidu.com/s/1kT8x2V9 看到这个ppt之前,其实自己也想过将Max当中的一些约束移植到游戏中,一方面是那时候能力不足,另一方面还是自己不那 ...