转载请注明出处:http://blog.csdn.net/ns_code/article/details/17512983



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

    CyclicBarrier(又叫障碍器)同样是Java5中加入的新特性,使用时需要导入Java.util.concurrent.CylicBarrier.它适用于这样一种情况:你希望创建一组任务,它们 ...

  2. 并发编程从零开始(十二)-Lock与Condition

    并发编程从零开始(十二)-Lock与Condition 8 Lock与Condition 8.1 互斥锁 8.1.1 锁的可重入性 "可重入锁"是指当一个线程调用 object.l ...

  3. 转:【Java并发编程】之二十三:并发新特性—信号量Semaphore(含代码)

    载请注明出处:http://blog.csdn.net/ns_code/article/details/17524153 在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作 ...

  4. Java并发编程系列之三十二:丢失的信号

    这里的丢失的信号是指线程必须等待一个已经为真的条件,在開始等待之前没有检查等待条件.这样的场景事实上挺好理解,假设一边烧水,一边看电视,那么在水烧开的时候.由于太投入而没有注意到水被烧开. 丢失的信号 ...

  5. Java并发编程的艺术(十二)——并发容器和框架

    ConcurrentHashMap 为什么需要ConcurrentHashMap HashMap线程不安全,因为HashMap的Entry是以链表的形式存储的,如果多线程操作可能会形成环,那样就会死循 ...

  6. java并发编程JUC第十二篇:AtomicInteger原子整型

    AtomicInteger 类底层存储一个int值,并提供方法对该int值进行原子操作.AtomicInteger 作为java.util.concurrent.atomic包的一部分,从Java 1 ...

  7. 转:【Java并发编程】之十二:线程间通信中notifyAll造成的早期通知问题(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17229601 如果线程在等待时接到通知,但线程等待的条件还不满足,此时,线程接到的就是早期 ...

  8. Java并发编程的艺术(十二)——线程安全

    1. 什么是『线程安全』? 如果一个对象构造完成后,调用者无需额外的操作,就可以在多线程环境下随意地使用,并且不发生错误,那么这个对象就是线程安全的. 2. 线程安全的几种程度 线程安全性的前提:对『 ...

  9. 【Java并发编程】之十二:线程间通信中notifyAll造成的早期通知问题

    如果线程在等待时接到通知,但线程等待的条件还不满足,此时,线程接到的就是早期通知,如果条件满足的时间很短,但很快又改变了,而变得不再满足,这时也将发生早期通知.这种现象听起来很奇怪,下面通过一个示例程 ...

随机推荐

  1. NYOJ 5 Binary String Matching

    Binary String Matching 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Given two strings A and B, whose alp ...

  2. 【python密码学编程】8.使用换位加密法加密

    替代加密法:用其他字符替代原有字符 换位加密法:搞乱字符顺序 [换位加密法]需要一个密钥 仅允许非商业转载,转载请注明出处

  3. Apache Kafka系列(二) 命令行工具(CLI)

    Apache Kafka命令行工具(Command Line Interface,CLI),下文简称CLI. 1. 启动Kafka 启动Kafka需要两步: 1.1. 启动ZooKeeper [roo ...

  4. Python pyspider 安装与开发

    PySpider 简介 PySpider是一个国人编写的强大的网络爬虫系统并带有强大的WebUI.采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器.任务监视器, ...

  5. Redis-入门笔记-15min带你一览redis

            如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持!       少年入门笔记,整理出来一起入坑!入门的视屏 ...

  6. python 集合 set

    集合 set:可变集合与不可变集合 可变集合:可以向集合中添加删除元素,非可哈希的,不能用作字典的键,也不能做其他集合的元素. 把不同的元素组成一起形成集合,集合不记录元素的位置或者插入点,也就是不能 ...

  7. SpringMVC创建HelloWorld程序

    1.IDE说明和依赖管理工具说明 开发工具:intellij idea 依赖管理使用:maven 2.创建maven工程 创建新的maven工程,并添加相应的文件夹,创建好的项目目录如下所示: 3.添 ...

  8. C进阶—详解编译、链接

    被隐藏了的过程    现如今在流行的集成开发环境下我们很少需要关注编译和链接的过程,而隐藏在程序运行期间的过程可不简单,即使使用命令行来编译一个源代码文件,简单的一句"gcc hello.c ...

  9. Get json formatted string from web by sending HttpWebRequest and then deserialize it to get needed data

    static string GetLotteryByPhase(string phaseNo) { // Set the url and charset string url = "http ...

  10. dnf命令 (常用总结)

    DNF是新一代的rpm软件包管理器.他首先出现在 Fedora 18 这个发行版中.而最近,它取代了yum,正式成为 Fedora 22 的包管理器. DNF包管理器克服了YUM包管理器的一些瓶颈,提 ...