博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发--CountDownLatch类
阅读量:2444 次
发布时间:2019-05-10

本文共 2796 字,大约阅读时间需要 9 分钟。

CountDownLatch

CountDownLatch是一个同步辅助类,位于java.util.concurrent包中。

其作用是:在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

闭锁可以延迟线程的进度知道其达到终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行:

  • 确保某个计算在其需要的所有资源都被初始化之后才继续执行;
  • 确保某个服务在其依赖的所有其他服务都已经启动之后才启动;
  • 等待直到某个操作所有参与者都准备就绪再继续执行;

CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果我们想等待N个点完成,这里就传入N。

当我么调用CountDownLatch的countDown()方法时,N就会减一,CountDownLatch的await方法会阻塞当前线程,知道N变成零。由于CountDown()方法可以用在任何地方,所以这里说的N个点,可以使N个线程,也可以是1个线程里的N个执行步骤。用在多个线程时,只需要把这个CountDownLatch的引用传递到线程里面即可。

是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。

注意: 计数器必须大于等于0,只是等于0的时候,计数器就是0,调用await方法时不会阻塞当前线程。CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部计数器。一个线程调用的countDown()方法happen-before,另外一个线程调用await方法。

源码

该类只提供了一个构造器:

/**     * Constructs a {@code CountDownLatch} initialized with the given count.     *     * @param count the number of times {@link #countDown} must be invoked     *        before threads can pass through {@link #await}     * @throws IllegalArgumentException if {@code count} is negative     */    public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); }

重要的方法:

/调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行public void await() throws InterruptedException {
}; //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行public boolean await(long timeout, TimeUnit unit) throws InterruptedException {
}; //将count值减1public void countDown() {
};

示例:计算20个线程执行共耗费的时间

package pers.zhang.juc.part1;import java.util.concurrent.CountDownLatch;/** * @author zhang * @date 2020/1/16 - 19:58 * * CountDownLatch:闭锁,在完成某些运算时,只有其他所有线程的运算全部完成,当前运算才继续执行。 */public class TestCountDownLatch {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(10); LatchDemo ld = new LatchDemo(latch); //开始时间 long startTime = System.currentTimeMillis(); for(int i = 0; i < 10; i++){
new Thread(ld).start(); } //主线程等待其他10个线程执行完毕 try {
latch.await(); } catch (InterruptedException e) {
e.printStackTrace(); } long endTime = System.currentTimeMillis(); System.out.println("10个并发线程共耗费时间为:" + (endTime - startTime)); }}class LatchDemo implements Runnable{
private CountDownLatch latch; public LatchDemo(CountDownLatch latch){
this.latch = latch; } @Override public void run() {
synchronized (this){
try {
for(int i = 0; i < 50000; i++){
if(i % 2 == 0){
System.out.println(i); } } }finally {
latch.countDown();//计数器减一,必须执行 } } }}

在这里插入图片描述

转载地址:http://jypqb.baihongyu.com/

你可能感兴趣的文章
用Wufoo创建简单表单:开发人员的观点
查看>>
heroku_使用Heroku和Facebook SDK在云中构建您的应用
查看>>
SitePoint播客#145:Addy Osmani的Backbone.js基础
查看>>
Google发布Chrome 4.0
查看>>
将ip保存在txt文档中_将任何文件存储在Google文档中
查看>>
disconf apps_Google Apps Drop IE6支持
查看>>
使用Screenr创建截屏视频
查看>>
微信小程序使用flex布局_使用Flex来启动您PHP应用程序!
查看>>
互联网总线带宽_新技术将使互联网带宽翻倍
查看>>
java自由职业者是什么_一个成功的自由职业者需要什么?
查看>>
java语言作为入门好吗_Java作为学生的第一语言
查看>>
sql内联接外联接三张表_在SQL中联接三个或更多表
查看>>
Django博客教程–创建一个简单的博客
查看>>
操作系统的主要类型_操作系统类型
查看>>
编程和编码的区别_安全编程和编码提示
查看>>
实用的小应用_使您的新应用更安全的实用提示
查看>>
小学生c语言编程入门教程_学生编程语言
查看>>
android mvp示例_Android深层链接示例
查看>>
Android RSS阅读器教程
查看>>
SkySilk –托管云服务提供商
查看>>