背景

在java.util.concurrent包中,有一个CountDownLatch的多线程同步器。含义参考javadoc的说明如下:

“A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.”

即它是当前线程用于等待若干子线程结束或超时的通知,用于自身继续处理的同步工具。一个典型使用场景是同步转异步处理:主线程的任务,进行拆分后,由子线程异步处理;处理结束后,主线程进行结果合成返回。

关键方法

a) 构造方法:CountDownLatch的构造函数只有一个

public CountDownLatch(int count);

入参为子线程组中子线程的数量。

b) countDown方法:

public void countDown();

当前线程任务已经就绪时调用,触发倒数计数,表示任务已经完成。

c)await方法:

//等待其它线程倒数结束才返回,否则一直阻塞

public void await() throwsInterruptedException;

//等待其它线程倒数结束,或超过指定的时间public boolean await(long timeout, TimeUnit unit) throws InterruptedException;

当前线程等待其它子线程任务结束,如果当前计数为0,则直接返回,否则表明所关联的其它线程任务并没有结束,当前线程将阻塞,直到计数器归0或超时。

一个示例

一个火箭发射任务的示例源代码如下。假定,main方法是用于火箭发射的整体任务,任务发射需要另外两个人进行相应倒数任务的处理,一个人仅负责偶数序号任务处理,另外一个人仅负责奇数序号任务的处理。

importjava.util.concurrent.CountDownLatch;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.atomic.AtomicInteger;public classRocketFire {private static final CountDownLatch beginSignal = new CountDownLatch(1);private static final CountDownLatch endSignal = new CountDownLatch(2);private static final AtomicInteger counter = new AtomicInteger(10);public static void main(String[] args) throwsInterruptedException {

System.out.println("开始倒数");

ExecutorService fixedThreadPool= Executors.newFixedThreadPool(2);

fixedThreadPool.submit(new NumberPrinter(true, beginSignal, endSignal));

fixedThreadPool.submit(new NumberPrinter(false, beginSignal, endSignal));

beginSignal.countDown();

endSignal.await();

System.out.println("点火!!");

fixedThreadPool.shutdown();

}private static class NumberPrinter implementsRunnable {private final booleanevenNumberPrinter;private finalCountDownLatch begin;private finalCountDownLatch end;public NumberPrinter(booleanevenNumberPrinter, CountDownLatch begin, CountDownLatch end) {this.evenNumberPrinter =evenNumberPrinter;this.begin =begin;this.end =end;

}

@Overridepublic voidrun() {try{

begin.await();

}catch(InterruptedException e) {

e.printStackTrace();

}while (true) {synchronized(counter) {int v =counter.get();if (v < 1) {break;

}if ((evenNumberPrinter && v % 2 == 0) || (!evenNumberPrinter && v % 2 == 1)) {

System.out.println(counter.getAndDecrement());

}

}

}

end.countDown();

}

}

}

输出如下:

开始倒数10

9

8

7

6

5

4

3

2

1点火!!

countanddown java_Java多线程之CountDownLatch相关推荐

  1. Java多线程之CountDownLatch用法

    Java多线程之CountDownLatch用法 本文目录: CountDownLatch基本概念 CountDownLatch案例:6个同学陆续离开教室后班长才可以关门 CountDownLatch ...

  2. (十)java多线程之CountDownLatch

    目录 引言 理论 例子 打赏 本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://gi ...

  3. JAVA多线程之CountDownLatch

    前序: 上周测试给开发的同事所开发的模块提出了一个bug,并且还是偶现. 经过仔细查看代码,发现是在业务中启用了多线程,2个线程同时跑,但是新启动的2个线程必须保证一个完成之后另一个再继续运行,才能消 ...

  4. java多线程之CountDownLatch倒数闸门

    在多个线程进行协作时,一个常见的情景是一个线程需要等待另外的线程完成某些任务之后才能继续进行.在这种情况下,可以使用CountDownLatch类,CountDownLatch类相当于多个线程等待开启 ...

  5. 多线程之CountDownLatch和CyclicBarrier的区别和用法

    一.CountDownLatch的使用 CountDownLatch经常用于监听某些初始化操作,等初始化执行完毕后,再通知主线程继续工作. CountDownLatch定义: 一个同步辅助类,在完成一 ...

  6. 高级JAVA - 多线程之CountDownLatch

    package com.xbz.thread.juc.countDownLatch;import java.util.concurrent.CountDownLatch;/*** @title Cou ...

  7. Java多线程同步屏障计算_Java多线程之CountDownLatch和CyclicBarrier同步屏障的使用

    一:CountDownLatch CountDownLatch是一个执行 完成任务线程数 的 倒数计数器.我们考虑这种情况:士兵晨练,必须全队士兵集合完毕才开始跑步.用程序描述就:在晨练线程中,逐个启 ...

  8. lock 线程 java_Java多线程之Lock的应用

    作为Java的另外一种同步机制,Lock与synchronized有很大的相似性,都可以实现多线程共用方法的同步和线程内代码块的同步.如果是实现共用方法同步,只需要在共用对象中生成一个Lock,并在共 ...

  9. Android多线程之ArrayBlockingQueue源码解析

    阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...

最新文章

  1. 在visual studio 2010中调用ffmpeg
  2. 我是Python小玩家,一行代码能做哪些炫酷的事情 (三十一)
  3. C++使用SQLite步骤及示例
  4. 一个七年程序员的经验
  5. Sharding-JDBC水平分库(水平数据库分片策略配置)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记010
  6. 深度学习论文和开源代码
  7. 《237 Gbit ps unrolled hardware polar decoder》237 Gbit / s展开的硬件极化解码器
  8. 听说支付宝有一个“疯起来连自己都打”的项目
  9. 核子公式——量化IT团队绩效
  10. AR VR MR三者的区别
  11. MATLAB libsvm 安装和使用
  12. 基于qt与mupdf库的pdf阅读器开发
  13. ffmpeg中的av_pix_fmt_descriptors
  14. 网站优化长尾关键字词库的挖掘与整理
  15. 关于蜂产品保健的一些介绍
  16. 图像处理中的距离含义
  17. 【学习cmake】cmake如何使用链接库 (link_directories, LINK_LIBRARIES, target_link_libraries,FIND_PACKAGE)实践篇2
  18. 快手正在成为下一个拼多多?
  19. 姗姗来迟的2019年展望
  20. unity-粒子系统

热门文章

  1. 戴尔t140服务器价格型号,戴尔_PowerEdge T140塔式服务器_企业服务器_网络存储服务器 | Dell 中国大陆...
  2. .和- 区别(C++)
  3. C语言求一个数的倒数的平方根近似值
  4. Java Swing/AWT和GTK混合GUI编程
  5. 轻松解决远程链接的“Gtk-WARNING **: cannot open display;”或“Cannot connect to display;”问题
  6. springboot实现条形码_Springboot转发重定向实现方式解析
  7. 总结Android开发中必备的代码Review清单
  8. mbsfn子帧_LTE多媒体广播多播业务关键技术研究
  9. python json文件操作_python对json的操作总结
  10. 均值滤波计算_从零学美颜算法保边滤波