java多线程系列(八)---CountDownLatch和CyclicBarrie
CountDownLatch
前言:如有不正确的地方,还望指正。
目录
- 认识cpu、核心与线程
- java多线程系列(一)之java多线程技能
- java多线程系列(二)之对象变量的并发访问
- java多线程系列(三)之等待通知机制
- java多线程系列(四)之ReentrantLock的使用
- java多线程系列(五)之synchronized ReentrantLock volatile Atomic 原理分析
- java多线程系列(六)之线程池原理及其使用
- java多线程系列(七)---Callable、Future和FutureTask
- java多线程系列(八)---CountDownLatch和CyclicBarrie
什么是CountDownLatch
- 允许一个或多个线程等待其他线程完成后再执行,比如说我们要等待人齐了才一起吃饭
核心方法
- CountDownLatch(int count):构造方法,初始计数器
- await():使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断
- countDown():计数器减一
- getCount():返回当前计数
使用过程
- CountDownLatch内部有一个线程数量计数器,当一个(或多个)线程执行await方法后等待,其他的线程完成任务后,计数器减一。如果此时计数器大于0,那么等待的线程继续等待。如果为0,表示其他线程任务执行完成,此时等待的线程会被唤醒
CountDownLatch使用
import java.util.concurrent.CountDownLatch;
public class Demo {
public static void main(String[] args) {
CountDownLatch cd = new CountDownLatch(3);
EatThread et=new EatThread(cd);
PeopleComeThread father=new PeopleComeThread(cd,"father");
PeopleComeThread mother=new PeopleComeThread(cd,"mother");
PeopleComeThread son=new PeopleComeThread(cd,"son");
et.start();
father.start();
mother.start();
son.start();
}
}
class EatThread extends Thread
{
CountDownLatch cd;
public EatThread(CountDownLatch cd)
{
this.cd=cd;
}
public void run()
{
System.out.println("等待人齐再吃饭");
try {
cd.await();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("好了,人齐开饭");
}
}
class PeopleComeThread extends Thread
{
CountDownLatch cd;
String name;
public PeopleComeThread(CountDownLatch cd,String name)
{
this.cd=cd;
this.name=name;
}
public void run()
{
System.out.println(name+"即将到达");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
cd.countDown();
}
}
- 输出结果
等待人齐再吃饭
mother即将到达
father即将到达
son即将到达
好了,人齐开饭
- 代码中我们只用到一个CountDownLatch对象,并初始化了一个计数器,执行await的线程等待,当执行一次countDown后,计数器减一,计数器为0后,等待的线程被唤醒
CyclicBarrier
什么是CyclicBarrier
- 它允许一组线程互相等待,直到到达某个公共屏障点 ,也就是说多个线程等待,达到一个点的时候唤醒。
核心方法
- CyclicBarrier(int parties),屏障(barrier)拦截的线程数,也就是parties个线程执行await方法后,这几个线程才能集体唤醒
- CyclicBarrier(int parties, Runnable barrierAction),barrierAction到达屏障后执行的任务
使用过程
- 同样是内部有一个计数器,初始化拦截的线程数,每一个线程执行awiat,计数器就会减一,当计数器为0的时候说明到达屏障,线程唤醒
CyclicBarrier使用
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Demo2 {
public static void main(String[] args) {
CyclicBarrier cb=new CyclicBarrier(3);
PeopleComeThread father=new PeopleComeThread(cb,"father");
PeopleComeThread mother=new PeopleComeThread(cb,"mother");
PeopleComeThread son=new PeopleComeThread(cb,"son");
father.start();
mother.start();
son.start();
}
}
class PeopleComeThread extends Thread
{
CyclicBarrier cb;
String name;
public PeopleComeThread(CyclicBarrier cb,String name)
{
this.cb=cb;
this.name=name;
}
public void run()
{
System.out.println(name+"等待其他人到齐,等到3个人都到齐就可以吃饭");
try {
cb.await();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("人齐了,"+name+"开始吃饭");
}
}
- 输出结果
mother等待其他人到齐,等到3个人都到齐就可以吃饭
father等待其他人到齐,等到3个人都到齐就可以吃饭
son等待其他人到齐,等到3个人都到齐就可以吃饭
人齐了,son开始吃饭
人齐了,mother开始吃饭
人齐了,father开始吃饭
- 代码中我们用到了CyclicBarrier对象,并给他初始化拦截的线程数为n,执行await的线程等待,当n个线程都执行await方法后,这n个线程唤醒
比较
- 两者都是一种消息等待通知机制,目的都是解决什么时候让等待的线程的唤醒
- CountDownLatch不能重置计数,CyclicBarrier可以
我觉得分享是一种精神,分享是我的乐趣所在,不是说我觉得我讲得一定是对的,我讲得可能很多是不对的,但是我希望我讲的东西是我人生的体验和思考,是给很多人反思,也许给你一秒钟、半秒钟,哪怕说一句话有点道理,引发自己内心的感触,这就是我最大的价值。(这是我喜欢的一句话,也是我写博客的初衷)
作者:jiajun 出处: http://www.cnblogs.com/-new/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。
java多线程系列(八)---CountDownLatch和CyclicBarrie的更多相关文章
- Java多线程系列——计数器 CountDownLatch
简介: CountDownLatch 是一个非常实用的多线程控制工具类,通常用来控制线程的等待,它可以让某个线程等待直到倒计时结束 CountDownLatch 提供了两个主要的方法,await(). ...
- java多线程系列:CountDownLatch
这篇文章将介绍CountDownLatch这个同步工具类的基本信息以及通过案例来介绍如何使用这个工具. CountDownLatch是java.util.concurrent包下面的一个工具类,可以用 ...
- Java多线程系列八——volatile和ThreadLocal
参考资料: http://ifeve.com/java-memory-model-4/ http://www.infoq.com/cn/articles/java-memory-model-1 htt ...
- 【Java多线程系列八】volatile和ThreadLocal
1. volatile final class Singleton { private static Singleton instance = null; private Singleton() { ...
- java多线程系列(九)---ArrayBlockingQueue源码分析
java多线程系列(九)---ArrayBlockingQueue源码分析 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 j ...
- Java多线程系列——从菜鸟到入门
持续更新系列. 参考自Java多线程系列目录(共43篇).<Java并发编程实战>.<实战Java高并发程序设计>.<Java并发编程的艺术>. 基础 Java多线 ...
- Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例
概要 前面对"独占锁"和"共享锁"有了个大致的了解:本章,我们对CountDownLatch进行学习.和ReadWriteLock.ReadLock一样,Cou ...
- Java多线程系列--“JUC锁”03之 公平锁(一)
概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
随机推荐
- centos7使用cobbler(2.8)批量部署操作系统之一
一. 批量部署操作系统的前提 要想批量部署操作系统,得具备以下条件: 客户机支持pxe网络引导 服务器端和客户端建立网络通信(DHCP) 服务器端要有可供客户机开机引导的引导文件 服务器端的可引 ...
- WPF制作带明细的环形图标
效果 明细用Popup实现的,录gif时,Popup显示不出来,不知道为什么,所以静态图凑合看吧 大体思路 图表使用Arc+Popup实现 图表分为两部分,一是环形部分,一是标注的明细部分. 环形部分 ...
- 【PHP】PHP面向对象编程--phpOOP入门
PHP从入门到精通 之PHP的面相对象编程 面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序 ...
- 事务之使用JDBC进行事务的操作
本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作.下一篇会讲述如何使用JDBC进行数据库的事务操作. 事务是指数据库中的一组逻辑操作,这个操作的特点就是在该组逻辑 ...
- VMware虚拟机下Ubuntu连不上网解决
虚拟机:VMware® Workstation 12 Pro Ubuntu: 14.04 问题描述:电脑从公司拿到家打开Ubuntu之后,打开自带Firefox浏览器,显示连接不上网,终端下ping ...
- 【D3】D3词汇表
按字母顺序 axis:数轴或坐标轴表示两个维度上数据尺度的直线 bar chart:条形图 (参见Excel)以矩形宽度反映数值大小的图表形式 bar:条形以宽度反映数值大小的矩形(rect) bin ...
- Linux安装搜狗输入法教程
最近开始学习linux 在安装输入法中遇到的一些问题,最终成功安装,也得益于网络上的前辈写的文章,现在将全部安装步骤以及遇到的一些问题总结如下: 基本上分三步走 1,添加fcitx的键盘输入法系统 ...
- [补档]happiness
happiness 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=1873 高一一班的座位表是个n×m的矩阵,经过一个学期的相处,每个同学和前 ...
- 拓扑排序 topsort详解
1.定义 对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列. 举例: h3 { marg ...
- 使用语音识别JAVA SDK 的MAVEN源代码制作语音控制智能家居Java APP-------MAVEN工程加载问题解决
一直想做一个可以录音的可执行JAVA APP,实现自然语言对话. 第一步就是实现把录音转成语义,比如你对着话筒说"你好",你获取回答相应的回复.你对着话筒说"今天的天气& ...