java.util.concurrent.CountDownLatch 是一个并发构造,它允许一个或多个线程等待一系列指定操作的完成。

CountDownLatch 以一个给定的数量初始化。countDown() 每被调用一次,这一数量就减一。通过调用 await() 方法之一,线程可以阻塞等待这一数量到达零。

利用它可以实现类似计数器的功能。

比如有一个任务A,它要等待其他5个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。

举个例子:

有五个工人在为老板干活,这个老板有一个习惯,就是当五个工人把一天的活都干完了的时候,他就来检查所有工人所干的活。记住这个条件:五个工人先全部干完活,老板才检查。所以在这里用Java代码设计两个类,Worker代表工人,Boss代表老板

import java.util.concurrent.CountDownLatch;

public class Main {
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(5);//五个工人 //工人
Worker worker1 = new Worker(countDownLatch);
new Thread(worker1).start();
Worker worker2 = new Worker(countDownLatch);
new Thread(worker2).start();
Worker worker3 = new Worker(countDownLatch);
new Thread(worker3).start();
Worker worker4= new Worker(countDownLatch);
new Thread(worker4).start();
Worker worker5 = new Worker(countDownLatch);
new Thread(worker5).start(); //老板
Boss boss = new Boss(countDownLatch);
new Thread(boss).start();
}
}
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; /**
* 工人
*/
public class Worker implements Runnable{
private CountDownLatch countDownLatch;
public Worker(CountDownLatch countDownLatch){
this.countDownLatch = countDownLatch;
} @Override
public void run() {
System.out.println(Thread.currentThread().getName()+",工人在干活。。。");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",工人干活结束。。。");
countDownLatch.countDown();
}
}
import java.util.concurrent.CountDownLatch;

/**
* 老板
*/
public class Boss implements Runnable{
private CountDownLatch countDownLatch;
public Boss(CountDownLatch countDownLatch){
this.countDownLatch = countDownLatch;
} @Override
public void run() {
System.out.println("老板等待所有工人干活完成。。");
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("所有工人干活完成,开始检查。。");
}
}

结果:

Thread-0,工人在干活。。。
Thread-1,工人在干活。。。
Thread-3,工人在干活。。。
Thread-2,工人在干活。。。
Thread-4,工人在干活。。。
老板等待所有工人干活完成。。
Thread-2,工人干活结束。。。
Thread-3,工人干活结束。。。
Thread-1,工人干活结束。。。
Thread-4,工人干活结束。。。
Thread-0,工人干活结束。。。
所有工人干活完成,开始检查。。

适用场景:

CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;

源码地址:https://github.com/qjm201000/concurrent_countDownLatch.git

并发编程-concurrent指南-计数器CountDownLatch的更多相关文章

  1. JAVA并发编程之倒计数器CountDownLatch

    CountDownLatch 的使用场景:在主线程中开启多线程去并行执行任务,并且主线程需要等待所有子线程执行完毕后汇总返回结果. 我把源码中的英文注释全部删除,写上自己的注释.就剩下 70 行不到的 ...

  2. 并发编程-concurrent指南-原子操作类-AtomicInteger

    在java并发编程中,会出现++,--等操作,但是这些不是原子性操作,这在线程安全上面就会出现相应的问题.因此java提供了相应类的原子性操作类. 1.AtomicInteger

  3. 并发编程-concurrent指南-线程池ExecutorService的实例

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  4. 并发编程-concurrent指南-ConcurrentMap

    ConcurrentMap 是个接口,你想要使用它的话就得使用它的实现类之一. ConcurrentMap,它是一个接口,是一个能够支持并发访问的java.util.map集合: 在原有java.ut ...

  5. 并发编程-concurrent指南-阻塞双端队列-链阻塞双端队列LinkedBlockingDeque

    LinkedBlockingDeque是双向链表实现的阻塞队列.该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除): 在不能够插入元素时,它将阻塞住试图插入元 ...

  6. 并发编程-concurrent指南-阻塞队列-链表阻塞队列LinkedBlockingQueue

    LinkedBlockingQueue是一个基于链表的阻塞队列. 由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选. LinkedBlocki ...

  7. 并发编程-concurrent指南-原子操作类-AtomicLong

    可以用原子方式更新的 long 值.有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范.AtomicLong 可用在应用程序中(如以原子方式增加的序列号), ...

  8. 并发编程-concurrent指南-原子操作类-AtomicBoolean

    类AtomicBoolean

  9. 并发编程-concurrent指南-ReadWriteLock-ReentrantReadWriteLock(可重入读写锁)

    几个线程都申请读锁,都能获取: import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantRea ...

随机推荐

  1. 你好,Oh My Zsh - 社区力量全新方式定义命令行 | 咖啡时间

    Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,Oh My Zsh 是一种生活方式.它基于 zsh 命令行,提供了主题配置,插件机制,已经内置的便捷操作.给我们一种全新的方式使用命 ...

  2. Linux之tail命令实时收集[纠正误解]

    tail [OPTION]... [FILE]... -c, --bytes=K            output the last K bytes; alternatively, use -c + ...

  3. WPF 集合分组排序

    <Window x:Class="ViewExam.MainWindow"        xmlns="http://schemas.microsoft.com/w ...

  4. jquery腾讯微博

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 获取同时间段不同的时间 php

    /** * 根据指定日期返回经过的年月 * @param string $sDay 开始日期 * @param string $eDay 结束日期 * @returnse multitype:stri ...

  6. 设置InputBox等提示框的字体以及样式

    InputBox等窗体的字体大小设置方法 Graphics.DefFontData.Height:=48;  Graphics.DefFontData.Style:=[fsBold,fsItalic, ...

  7. discuz电脑访问手机版域名怎么跳转到电脑版本

    用discuz论坛访问手机版本的域名不会自动跳转到电脑版本,而是会跳转到域名+misc.php?mod=mobile体验很不好.现提供修改方法:打开论坛根目录找到文件./source/class/di ...

  8. 常用的shell(备份数据库、备份网站、切割访问日志)

    备份网站程序 #!/bin/bash /bin/tar czf /mnt/backup_website/web_$(date +%Y%m%d_%H%M%S).gz.tar /mnt/wwwroot/w ...

  9. Win8Metro(C#)数字图像处理--2.23二值图像开运算

    原文:Win8Metro(C#)数字图像处理--2.23二值图像开运算  [函数名称] 二值图像开运算函数OpenOperateProcess(WriteableBitmap src) [算法说明 ...

  10. Delphi编程中Http协议应用

    Http协议的通信遵循一定的约定.例如,请求一个文件的时候先发送Get请求,然后服务器会返回请求的数据.如果需要进行断点传输,那么先发送'HEAD /'请求,其中返回的'Content-Length: ...