CountDownLatch

监听某个线程的初始化,等待初始化执行完毕后,通知主线程工作。延迟、阻塞的是主线程,在单个线程中。

CyclicBarrier

针对多个线程、线程池,多个线程初始化准备之后,去操作同一件事件(必须一定要所有准备才可执行,通知各的主线程去执行正常工作)。

  1. package demo2;
  2. import java.util.Random;
  3. import java.util.concurrent.BrokenBarrierException;
  4. import java.util.concurrent.CyclicBarrier;
  5. import java.util.concurrent.ExecutorService;
  6. import java.util.concurrent.Executors;
  7. /**
  8. * Created by liudan on 2017/7/30.
  9. */
  10. public class DemoCyclicBarrier {
  11. /**
  12. * 假设一个场景:3个运动员,当跑步运动员准备好了,才一起出发
  13. */
  14. static class Runner implements Runnable {
  15. private CyclicBarrier CYCLIC_BARRIER;
  16. private String name;
  17. public Runner(CyclicBarrier CYCLIC_BARRIER, String name) {
  18. this.CYCLIC_BARRIER = CYCLIC_BARRIER;
  19. this.name = name;
  20. }
  21. @Override
  22. public void run() {
  23. try {
  24. Thread.sleep(1000 * (new Random().nextInt(5)));
  25. System.err.println(name + "\t准备好了");
  26. CYCLIC_BARRIER.await();
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. } catch (BrokenBarrierException e) {
  30. e.printStackTrace();
  31. }
  32. System.err.println("Go!");
  33. }
  34. public static void main(String[] args) {
  35. CyclicBarrier CYCLIC_BARRIER = new CyclicBarrier(3);
  36. ExecutorService executorService = Executors.newFixedThreadPool(3);
  37. executorService.execute(new Runner(CYCLIC_BARRIER, "1号"));
  38. executorService.execute(new Runner(CYCLIC_BARRIER, "2号"));
  39. executorService.execute(new Runner(CYCLIC_BARRIER, "2号"));
  40. executorService.shutdown();
  41. }
  42. }
  43. }
  44. 输出:
  45. 1号 准备好了
    2号 准备好了
    2号 准备好了
    Go!
    Go!
    Go!
案例2
  1. public class TestCyclicBarrier {
  2. private static final int THREAD_NUM = 5;
  3. public static class WorkerThread implements Runnable{
  4. CyclicBarrier barrier;
  5. public WorkerThread(CyclicBarrier b){
  6. this.barrier = b;
  7. }
  8. @Override
  9. public void run() {
  10. // TODO Auto-generated method stub
  11. try{
  12. System.out.println("Worker's waiting");
  13. //线程在这里等待,直到所有线程都到达barrier。
  14. barrier.await();
  15. System.out.println("ID:"+Thread.currentThread().getId()+" Working");
  16. }catch(Exception e){
  17. e.printStackTrace();
  18. }
  19. }
  20. }
  21. /**
  22. * @param args
  23. */
  24. public static void main(String[] args) {
  25. // TODO Auto-generated method stub
  26. CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {
  27. //当所有线程到达barrier时执行
  28. @Override
  29. public void run() {
  30. // TODO Auto-generated method stub
  31. System.out.println("Inside Barrier");
  32. }
  33. });
  34. for(int i=0;i<THREAD_NUM;i++){
  35. new Thread(new WorkerThread(cb)).start();
  36. }
  37. }
  38. }
  39. /*
  40. 以下是输出:
  41. Worker's waiting
  42. Worker's waiting
  43. Worker's waiting
  44. Worker's waiting
  45. Worker's waiting
  46. Inside Barrier
  47. ID:12 Working
  48. ID:8 Working
  49. ID:11 Working
  50. ID:9 Working
  51. ID:10 Working
  52. */

12.线程通信CyclicBarrier的更多相关文章

  1. Java线程通信

    Java线程通信 螣蛇乘雾,终为土灰. 多个线程协同工作完成某个任务时就会涉及到线程间通信问题.如何使各个线程之间同时执行,顺序执行.交叉执行等. 一.线程同时执行 创建两个线程a和b,两个线程内调用 ...

  2. Linux下c开发 之 线程通信(转)

    Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...

  3. Java核心知识点学习----使用Condition控制线程通信

    一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...

  4. .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法

    1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...

  5. JAVA基础知识之多线程——线程通信

    传统的线程通信 Object提供了三个方法wait(), notify(), notifyAll()在线程之间进行通信,以此来解决线程间执行顺序等问题. wait():释放当前线程的同步监视控制器,并 ...

  6. Linux使用定时器timerfd 和 eventfd接口实现进程线程通信

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  7. JAVA多线程提高二:传统线程的互斥与同步&传统线程通信机制

    本文主要是回顾线程之间互斥和同步,以及线程之间通信,在最开始没有juc并发包情况下,如何实现的,也就是我们传统的方式如何来实现的,回顾知识是为了后面的提高作准备. 一.线程的互斥 为什么会有线程的互斥 ...

  8. Linux下c开发 之 线程通信

    Linux下c开发 之 线程通信 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身 ...

  9. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

随机推荐

  1. VMware无法识别USB设备

    VMware虚拟机开始还能识别USB设备/U盘,突然就不行了,在网上找了好久,提供的方法大致如下: 1.   首先Ctrl+R启动运行,输入services.msc,找到一个VMware USB dr ...

  2. javascript方法--apply()

    今天琢磨了一下apply,以前对这个方法觉得比较懵,今天一琢磨确实觉得挺好玩的. 一开始把MDN的apply文档看了一遍,感觉不是很理解,而且有一些东西也是知道但是比较模糊,所以还是一步一步来,不懂查 ...

  3. shell 中的<,<<,>,>>

    相信熟悉linux的童鞋不会对这四个符合陌生,shell脚本的文件流有时候真的挺容易搞晕人的,下面我们一起了解一下吧 参考链接:http://www.cnblogs.com/chengmo/archi ...

  4. MySQL-数据操作

    阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 回到顶部 一 介绍 MySQL数据操作: DML ============= ...

  5. CentOS7.5安装配置Oh-My-Zsh

    一.安装 首先安装zshyum -y install zsh 下载 oh-my-zsh 项目来帮我们配置 zsh,采用wget安装(需要先安装git)sh -c "$(wget https: ...

  6. 解析 Qt 程序在Windows 下发布

    原文请看:http://www.cnblogs.com/elect-fans/archive/2012/03/15/2408579.html Qt 程序在Windows下发布是本文要介绍的内容,不多说 ...

  7. 乱侃OOD

    接口代表的就是共同性,所谓面向接口编程,就是要抽象各种不同概念的共同点 然后把这些概念的不同点用具体的类包装起来,这样一看,面向接口编程就等于面向对象编程 其实说白了是一个概念 IOC就是要把对细节的 ...

  8. ExtJs基础

    方法和属性 Ext.caeate方法相当于创建一个实例对象 renderTo:Ext.getBody()  新创建的组件渲染到什么位置 grid.render('grid-example'); /re ...

  9. 主元素 II

    主元素 II 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一. 样例 给出数组[1,2,1,2,1,3,3] 返回 1 注意 数组中只有唯一的主元素 挑战 要求时间复 ...

  10. 第八届山东省ACM大学生程序设计竞赛个人总结

    因为省赛,从开学紧张到5月7号.心思也几乎全放在ACM的训练上.因为我还是校台球协会的会长,所以台协还有一些事情需要忙,但是我都给延迟了.老会长一直在催我办校赛,但我一直说 等等吧,因为校赛只能在周六 ...