12.线程通信CyclicBarrier
CountDownLatch
监听某个线程的初始化,等待初始化执行完毕后,通知主线程工作。延迟、阻塞的是主线程,在单个线程中。
CyclicBarrier
针对多个线程、线程池,多个线程初始化准备之后,去操作同一件事件(必须一定要所有准备才可执行,通知各的主线程去执行正常工作)。
package demo2;import java.util.Random;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/*** Created by liudan on 2017/7/30.*/public class DemoCyclicBarrier {/*** 假设一个场景:3个运动员,当跑步运动员准备好了,才一起出发*/static class Runner implements Runnable {private CyclicBarrier CYCLIC_BARRIER;private String name;public Runner(CyclicBarrier CYCLIC_BARRIER, String name) {this.CYCLIC_BARRIER = CYCLIC_BARRIER;this.name = name;}@Overridepublic void run() {try {Thread.sleep(1000 * (new Random().nextInt(5)));System.err.println(name + "\t准备好了");CYCLIC_BARRIER.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.err.println("Go!");}public static void main(String[] args) {CyclicBarrier CYCLIC_BARRIER = new CyclicBarrier(3);ExecutorService executorService = Executors.newFixedThreadPool(3);executorService.execute(new Runner(CYCLIC_BARRIER, "1号"));executorService.execute(new Runner(CYCLIC_BARRIER, "2号"));executorService.execute(new Runner(CYCLIC_BARRIER, "2号"));executorService.shutdown();}}}输出:1号 准备好了
2号 准备好了
2号 准备好了
Go!
Go!
Go!
public class TestCyclicBarrier {private static final int THREAD_NUM = 5;public static class WorkerThread implements Runnable{CyclicBarrier barrier;public WorkerThread(CyclicBarrier b){this.barrier = b;}@Overridepublic void run() {// TODO Auto-generated method stubtry{System.out.println("Worker's waiting");//线程在这里等待,直到所有线程都到达barrier。barrier.await();System.out.println("ID:"+Thread.currentThread().getId()+" Working");}catch(Exception e){e.printStackTrace();}}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubCyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {//当所有线程到达barrier时执行@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("Inside Barrier");}});for(int i=0;i<THREAD_NUM;i++){new Thread(new WorkerThread(cb)).start();}}}/*以下是输出:Worker's waitingWorker's waitingWorker's waitingWorker's waitingWorker's waitingInside BarrierID:12 WorkingID:8 WorkingID:11 WorkingID:9 WorkingID:10 Working*/
12.线程通信CyclicBarrier的更多相关文章
- Java线程通信
Java线程通信 螣蛇乘雾,终为土灰. 多个线程协同工作完成某个任务时就会涉及到线程间通信问题.如何使各个线程之间同时执行,顺序执行.交叉执行等. 一.线程同时执行 创建两个线程a和b,两个线程内调用 ...
- Linux下c开发 之 线程通信(转)
Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...
- Java核心知识点学习----使用Condition控制线程通信
一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...
- .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法
1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...
- JAVA基础知识之多线程——线程通信
传统的线程通信 Object提供了三个方法wait(), notify(), notifyAll()在线程之间进行通信,以此来解决线程间执行顺序等问题. wait():释放当前线程的同步监视控制器,并 ...
- Linux使用定时器timerfd 和 eventfd接口实现进程线程通信
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- JAVA多线程提高二:传统线程的互斥与同步&传统线程通信机制
本文主要是回顾线程之间互斥和同步,以及线程之间通信,在最开始没有juc并发包情况下,如何实现的,也就是我们传统的方式如何来实现的,回顾知识是为了后面的提高作准备. 一.线程的互斥 为什么会有线程的互斥 ...
- Linux下c开发 之 线程通信
Linux下c开发 之 线程通信 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身 ...
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
随机推荐
- 数据库简述(以MySQL为例)
一.数据库中的概念 1.数据库是用户存放数据.访问数据.操作数据的存储仓库,用户的各种数据被有组织地存放在数据库中.可以随时被有权限的用户查询.统计.添加.删除和修改.可以说,数据库是长期存储在计算机 ...
- DOM编程艺术读书笔记 (须熟读)
http://www.qdfuns.com/notes/39151/00d8bc6322359f00450f492ae56bf69e.html
- leetcode 121 122 123 . Best Time to Buy and Sell Stock
121题目描述: 解题:记录浏览过的天中最低的价格,并不断更新可能的最大收益,只允许买卖一次的动态规划思想. class Solution { public: int maxProfit(vector ...
- 算法入门系列2:k近邻算法
用官方的话来说,所谓K近邻算法(k-Nearest Neighbor,KNN),即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个 ...
- java 多线程剖析
问题的缘由源自于一道简单的面试题:题目要求如下: 建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC. 解决问题前我们前补充一些基本知识: ...
- hdu 1671(字典树判断前缀)
Phone List Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- python 函数的几个属性 func_name, func_code等
直接见代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/07/25 10:14 def add(x=0, y=1): & ...
- web前端—css面试题
1.CSS 选择符有哪些? 2.CSS 优先级的选择过程? 优先级复合就近原则,同权重的情况下有限选择最近的属性. 载入样式的话是以最后载入的定位为准. 优先级: !important > id ...
- 四十四 常用内建模块 struct
准确地讲,Python没有专门处理字节的数据类型.但由于str既是字符串,又可以表示字节,所以,字节数组=str.而在C语言中,我们可以很方便地用struct.union来处理字节,以及字节和int, ...
- OpenStack 镜像服务 Glance部署(七)
创建虚拟机我们需要有glance的支持,因为glance是提供镜像的服务. Glance有两个比较重要的服务: Glance-api:接受云系统镜像的构建.删除.读取请求 Glance-Registr ...