CountDownLatch

前言:如有不正确的地方,还望指正。

目录

什么是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的更多相关文章

  1. Java多线程系列——计数器 CountDownLatch

    简介: CountDownLatch 是一个非常实用的多线程控制工具类,通常用来控制线程的等待,它可以让某个线程等待直到倒计时结束 CountDownLatch 提供了两个主要的方法,await(). ...

  2. java多线程系列:CountDownLatch

    这篇文章将介绍CountDownLatch这个同步工具类的基本信息以及通过案例来介绍如何使用这个工具. CountDownLatch是java.util.concurrent包下面的一个工具类,可以用 ...

  3. Java多线程系列八——volatile和ThreadLocal

    参考资料: http://ifeve.com/java-memory-model-4/ http://www.infoq.com/cn/articles/java-memory-model-1 htt ...

  4. 【Java多线程系列八】volatile和ThreadLocal

    1. volatile final class Singleton { private static Singleton instance = null; private Singleton() { ...

  5. java多线程系列(九)---ArrayBlockingQueue源码分析

    java多线程系列(九)---ArrayBlockingQueue源码分析 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 j ...

  6. Java多线程系列——从菜鸟到入门

    持续更新系列. 参考自Java多线程系列目录(共43篇).<Java并发编程实战>.<实战Java高并发程序设计>.<Java并发编程的艺术>. 基础 Java多线 ...

  7. Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例

    概要 前面对"独占锁"和"共享锁"有了个大致的了解:本章,我们对CountDownLatch进行学习.和ReadWriteLock.ReadLock一样,Cou ...

  8. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  9. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

随机推荐

  1. IP协议详解

    Internet地址结构 表示IP地址 目前的IP版本有4和6. 目前最流行的就是IPv4,有十进制和二进制两种表示方法.分别是: 点分四组十进制.每一组范围是[0~255],如:255.255.25 ...

  2. Hibernate快速入门实例

    Hibernate工程项目创建基本步骤:导包(Hibernate依赖包.SQL驱动包).编写实体类.编写ORM映射配置文件.编写核心配置文件.编写测试驱动. 整个工程项目结构如下图: 一.导包 笔者使 ...

  3. VB6获取Chrome地址栏的URL信息

    上篇写到了获取IE8浏览器URL的一般方法,那这篇就写下chrome的URL怎么获取.事实上,早期的chrome版本可以通过跟IE8差不多方式获取到URL信息.但是,现在chrome的控件都是Dire ...

  4. voa 2015.4.29

    Nepal has declared three days of mourning for the victims of Saturday's 7.8 magnitude earthquake tha ...

  5. 关于移动APP与Web APP的测试重点以及区别

    Web app测试重点: 1. 功能测试:功能的实现是否满足需求. 2. 性能测试: 2.1 链接速度测试:测试页面链接的速度 2.2 负载测试:web应用系统能允许多少个用户同时在线?超过这个数量会 ...

  6. 华为CloudIDE免费公测,带你出坑带你飞

    你的代码仓库上线了吗?是不是有时候遇到这样的问题? 只想浏览一下代码,却发现线上浏览效果不佳,高亮显示什么的都没有.而在桌面端浏览要需要先同步代码,再用桌面端的IDE打开.尤其是使用git的时候,先要 ...

  7. windows环境下,anoconnda安装tensorflow

    最近对深度学习研究比较多,目前最火的Python深度学习库应该是tensorflow了. 为了方便,本人在windows下用anaconda来使用python,且同时安装了,anaconda2,3,3 ...

  8. CSS3浏览器兼容

    不同的浏览器需要不同的前缀 -webkit chrome和safari -moz firefox -ms ie -o opera 一个炫酷标题效果: HTML: <!DOCTYPE HTML&g ...

  9. tensorflow max_pool(最大池化)应用

    1.最大池化 max pooling是CNN当中的最大值池化操作,其实用法和卷积很类似. tf.nn.max_pool(value, ksize, strides, padding, name=Non ...

  10. MySql数据库在表中添加新字段,设置主键,设置外键,字段移动位置,以及修改数据库后如何进行部署和维护的总结

    1,为当前已有的表添加新的字段 alter table student add studentName varchar(20) not null; 2,为当前已有的表中的字段设置为主键自增 alter ...