这里我暂时只讲CountDownLatch的作用和怎么使用,至于他是怎么实现这种功能的,涉及源码,以后我再补上。

正文

什么是CountDownLatch?

  CountDownLatch是在java1.5被引入,存在于java.util.cucurrent包下。CountDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。
  他是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。

为什么要使用CountDownLatch?

  在我们的业务中,可能会需要用到多线程去处理业务,而主线程必须乖乖等其他线程处理完后,再向用户返回处理结果,是成功还是失败。这时候我们该怎么办呢,CountDownLatch就能很好的实现我们的功能。

怎么使用CountDownLatch?
  CountDownLatch的使用其实很简单,我们在主线程创建一个CountDownLatch,然后将它传递给各个子线程,主线程完成自己的业务后调用await方法挂起,各子线程完成功能后,调用countDown方法将计数器减一,CountDownLatch的计数器为0后,主线程被唤醒,处理自己的业务。

举个例子

public class CountdownlachTest {
public static void main(String[] args) {
/** 先开个玩具厂 */
ToyFactory factory = new ToyFactory();
/** 玩具厂生产玩具咯,先来50个玩具 */
int toyNum = factory.produceToy(50);
System.err.println(toyNum + "个玩具新鲜出炉");
CountDownLatch countDownLatch = new CountDownLatch(toyNum);
/** 叫销售员去卖吧 */
ToySalesperson zhangsan = new ToySalesperson("张三",12,factory,countDownLatch);
ToySalesperson lisi = new ToySalesperson("李四",12,factory,countDownLatch);
ToySalesperson wangwu = new ToySalesperson("王五",10,factory,countDownLatch);
ToySalesperson zhaoliu = new ToySalesperson("赵六",16,factory,countDownLatch);
/** 销售员干活吧 */
zhangsan.start();
lisi.start();
wangwu.start();
zhaoliu.start();
/** 继续产玩具 */
int produceToy = factory.produceToy(100);
if(produceToy <= 0) {
/** 还有玩具不给我生产,那我关厂等呗 */
try {
countDownLatch.await();
} catch (InterruptedException e) {
System.err.println("玩具厂----暂停营业呢,你们来吵我干嘛");
}
}
if(factory.toyNum <= 0) {
/** 玩具卖完了,继续开工吧 */
System.err.println("玩具厂----我又复活了,大量招工");
}
}
} /**
* 玩具工厂
* */
class ToyFactory{
Integer toyNum = 0; // 玩具数量
/** 生产玩具 */
public int produceToy(int num) {
if(toyNum > 0) {
System.err.println("厂里还有玩具,必须先卖完,不能堆积");
return 0;
}
this.toyNum = num;
return this.toyNum;
}
}
/**
* 销售员
* */
class ToySalesperson extends Thread{
String name; // 线程名
int myToyNum; // 我的任务量
CountDownLatch countDownLatch; // 剩余总量
ToyFactory factory;
public ToySalesperson(String name,int myToyNum,ToyFactory factory,CountDownLatch countDownLatch) {
super(name);
this.name = name;
this.myToyNum = myToyNum;
this.countDownLatch = countDownLatch;
this.factory = factory;
}
@Override
public void run() {
/** 不断卖玩具 */
while(true) {
if(myToyNum <= 0) {
System.err.println(name + "----" + "我的任务完成了,玩具卖完了,老子不用再加班了!!!");
return;
}
try {
/** 模拟到处跑卖玩具 */
TimeUnit.SECONDS.sleep(2);
System.err.println(name + "----" + "终于卖出一个了,真艰难啊,还剩" + myToyNum + "个");
myToyNum--;
countDownLatch.countDown();
synchronized (factory.toyNum) {
factory.toyNum--;
}
} catch (InterruptedException e) {
/** 线程被中断 */
System.err.println(name + "----" + "老板给我穿小鞋,老子不干啦");
return;
}
}
}
}

CountDownLatch 计数器的更多相关文章

  1. java 5线程中 Semaphore信号灯,CyclicBarrier类,CountDownLatch计数器以及Exchanger类使用

    先来讲解一下Semaphore信号灯的作用:  可以维护当前访问自身的线程个数,并提供了同步机制, 使用semaphore可以控制同时访问资源的线程个数 例如,实现一个文件允许的并发访问数. 请看下面 ...

  2. CycliBarriar和CountdownLatch(计数器)

    CyclicBarrier可以重复使用,而CountdownLatch不能重复使用. countDownLatch这个类使一个线程等待其他线程各自执行完毕再执行. 是通过一个计数器来实现的,计数器的初 ...

  3. 并发工具类:CountDownLatch、CyclicBarrier、Semaphore

    在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...

  4. JUC系列回顾之-CountDownLatch底层原理和示例

    CountDownLatch 是一个同步工具类,允许一个线程或者多个线程等待其他线程完成操作,再执行. CountDownLatch(int count) 构造一个用给定计数初始化的 CountDow ...

  5. CountDownLatch——闭锁的实现之一

    CountDownLatch实际上是一种闭锁实现.闭锁:是一种同步工具类,可以延迟线程的进度知道其到达终止状态--<Java并发编程实战>.这个怎么解释呢?简单来说,就是有1个线程需要等待 ...

  6. java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser)

    线程同步辅助类,主要学习两点: 1.上述几种同步辅助类的作用以及常用的方法 2.适用场景,如果有适当的场景可以用到,那无疑是最好的 semaphore(seməˌfôr) 含义 信号量就是可以声明多把 ...

  7. Java中使用CountDownLatch进行多线程同步

    CountDownLatch介绍 在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法: 1.synchronized关键字进行同步. 2.Lock锁接口及其实现类ReentrantL ...

  8. ccse(CountDownLatch,CycliBarrier,Semaplore,Exchanger)

    关于等待状态的线程调用interrupt方法报异常:InterruptedException 当线程被阻塞,比如wait,join,sleep等,在调用interrupt方法,没有占用cpu运行的线程 ...

  9. Java并发编程的4个同步辅助类(CountDownLatch、CyclicBarrier、Semaphore、Phaser)

    我在<JDK1.5引入的concurrent包>中,曾经介绍过CountDownLatch.CyclicBarrier两个类,还给出了CountDownLatch的演示案例.这里再系统总结 ...

随机推荐

  1. vnc server,vnc server去哪下载,下载后如何连接使用(vnc viewer)

    vnc server是vnc服务端,通过需要下载的服务器连接之后在服务器端下载. 1.使用到的工具:iis7服务器管理 2.首先去服务器端下载vnc 3.根据要求安装结束,得到登录密码. 4.用IIS ...

  2. 说了这么多次 I/O,但你知道它的原理么

    O 软件目标 设备独立性 现在让我们转向对 I/O 软件的研究,I/O 软件设计一个很重要的目标就是设备独立性(device independence).啥意思呢?这意味着我们能够编写访问任何设备的应 ...

  3. Beta冲刺——5.24

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.安排每个人进行为期3天的 ...

  4. 开心一下-实现一个基于Java的中文编程语言2

    https://mp.weixin.qq.com/s/VmCTvh0c7X9DjIgIMycdlw   上一篇所提到的只是使用中文写Java,而不能算作一门新的语言.作为一门中文语言,需要语言提供的关 ...

  5. Shell 脚本(五) Shell 工具 及 企业面试题

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 十.Shell工具(重点) 1.cut cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的. ...

  6. 第六届蓝桥杯JavaA组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有 ...

  7. 智能家居巨头 Aqara 基于 KubeSphere 打造物联网微服务平台

    背景 从传统运维到容器化的 Docker Swarm 编排,从 Docker Swarm 转向 Kubernetes,然后在 Kubernetes 运行 SpringCloud 微服务全家桶,到最终拥 ...

  8. 认识OSI七层模型

    概述: OSI全名(Open System Interconnect),是指定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架.层次:从低到高的层级:物理层.数据链路层.网络层.传 ...

  9. hadoop知识整理(3)之MapReduce之代码编写

    前面2篇文章知道了HDFS的存储原理,知道了上传和下载文件的过程,同样也知晓了MR任务的执行过程,以及部分代码也已经看到,那么下一步就是程序员最关注的关于MR的业务代码(这里不说太简单的): 一.关于 ...

  10. activeMQ从入门到简单集群指南

    1.什么是amq MQ是消息中间件,基于JAVA的JMS消息服务机制来传递信息. 2.mq的作用 MQ给程序之间提供了一个缓冲,避免了在程序交互频繁的情况下,提高程序性能瓶颈和数据的可靠性 3.mq怎 ...