Java并发工具CountDownLatch使用详解

article/2025/11/7 12:35:42

本文目录

  • 1、使用场景
  • 2、使用介绍
  • 3、使用案例
  • 4、 Thread.join()和CountDownLatch的区别

1、使用场景

通过使用 CountDownLatch可以使当前线程阻塞,等待其他线程完成给定任务。可以类比旅游团导游要等待所有的游客到齐后才能去下一个景点。

CountDownLatch 主要应用场景:一个线程等待多个线程完成给定任务后,然后执行后续的操作的场景。
在这里插入图片描述

2、使用介绍

CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完 成,这里就传入N。这里所说的N个 点,可以是N个线程,也可以是1个线程里的N个执行步骤。CountDownLatch构造函数如下:

public CountDownLatch(int count) {if (count < 0) throw new IllegalArgumentException("count < 0");this.sync = new Sync(count);}

计数器参数count必须大于等于0,等于0的时候,调用await方法时不会 阻塞当前线程。

当我们调用CountDownLatchcountDown()方法时,N就会减1,CountDownLatchawait()方法 会阻塞当前线程,直到N变成零。

CountDownLatch 方法

  • await() 阻塞当前线程,直到计数器为零为止;
  • await(long timeout, TimeUnit unit) await()的重载方法,可以指定阻塞时长;
  • countDown() 计数器减1,如果计数达到零,释放所有等待的线程。
  • getCount() 返回当前计数

3、使用案例

使用多线程下载网络上图片,现在完成后,提示用户下载完成。

public class DownLoadWorker implements Runnable{private String url;private  CountDownLatch countDownLatch;public DownLoadWorker(String url, CountDownLatch countDownLatch) {this.url = url;this.countDownLatch = countDownLatch;}@Overridepublic void run() {//省略无数业务代码System.out.println("线程" + Thread.currentThread().getName() + "开始下载完成");countDownLatch.countDown();}
}public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch=new CountDownLatch(5);//使用Stream 生成5个线程List<Thread> workers = Stream.generate(() -> new Thread(new DownLoadWorker("https://image.baidu.com/", countDownLatch))).limit(5).collect(toList());//运行线程workers.forEach(Thread::start);//等待线程完成countDownLatch.await();System.out.println("图片已下载完~~~");
}

4、 Thread.join()和CountDownLatch的区别

  • Thread.join()是Thread类的一个方法,Thread.join()的实现是依靠Object的wait()notifyAll()来完成的,而CountDownLatch是JUC包中的一个工具类。

    当我们使用ExecutorService ,就不能使用join,必须使用CountDownLatch比如:

    ExecutorService service = Executors.newFixedThreadPool(5);
    final CountDownLatch latch = new CountDownLatch(5);
    for(int x = 0; x < 5; x++) {service.submit(new Runnable() {public void run() {// do somethinglatch.countDown();}});
    }
    latch.await();
    
  • 调用join方法需要等待thread执行完毕才能继续向下执行,而CountDownLatch只需要检查计数器的值为零就可以继续向下执行,相比之下,CountDownLatch更加灵活一些,可以实现一些更加复杂的业务场景。


http://chatgpt.dhexx.cn/article/eW3R9bV0.shtml

相关文章

Java 并发编程(一):简介

这篇文章的标题原本叫做——Java 并发编程(一)&#xff1a;简介&#xff0c;作者名叫小二。但我在接到投稿时觉得这标题不够新颖&#xff0c;不够吸引读者的眼球&#xff0c;就在发文的时候强行修改了标题&#xff08;也不咋滴&#xff09;。 小二是一名 Java 程序员&#xff…

Java并发编程的艺术下载

本书简介 并发编程领域的扛鼎之作&#xff0c;作者是阿里和1号店的资深Java技术专家&#xff0c;对并发编程有非常深入的研究&#xff0c;《Java并发编程的艺术》是他们多年一线开发经验的结晶。本书的部分内容在出版早期发表在Java并发编程网和InfoQ等技术社区&#xff0c;得…

Java并发工具之Semaphore

一、简介 摘自《Java并发编程的艺术》一书 Semaphore&#xff08;信号量&#xff09;是用来控制同时访问特定资源的线程数量&#xff0c;它通过协调各个线程&#xff0c;以保证合理的使用公共资源。 Semaphore一般用于流量的控制&#xff0c;特别是公共资源有限的应用场景。例…

Java 并发编程实战-创建和执行任务的最佳实践

若无法通过并行流实现并发&#xff0c;则必须创建并运行自己的任务。运行任务的理想Java 8方法就是CompletableFuture。 Java并发的历史始于非常原始和有问题的机制&#xff0c;并且充满各种尝试的优化。本文将展示一个规范形式&#xff0c;表示创建和运行任务的最简单&#x…

java并发-java并发大师

文章目录 java并发大师James GoslingDoug Lea 参考 java并发大师 聊聊java&#xff08;十&#xff09;Java并发大师Brain Goetz和Doug Lea 的中英文博客文章地址 参考URL: https://blog.csdn.net/weixin_33963594/article/details/92481739 James Gosling 技术大牛收割机&am…

java并发编程之 并发问题及解决方法

一、并发问题的根源 首先&#xff0c;我们要知道并发要解决的是什么问题&#xff1f;并发要解决的是单进程情况下硬件资源无法充分利用的问题。而造成这一问题的主要原因是CPU-内存-磁盘三者之间速度差异实在太大。如果将CPU的速度比作火箭的速度&#xff0c;那么内存的速度就…

『图解Java并发编程系列』10张图告诉你Java并发多线程那些破事

目录 线程安全问题 活跃性问题 性能问题 有态度的总结 头发很多的程序员&#xff1a;『师父&#xff0c;这个批量处理接口太慢了&#xff0c;有什么办法可以优化&#xff1f;』架构师&#xff1a;『试试使用多线程优化』第二天头发很多的程序员&#xff1a;『师父&#xff…

Java基础-并发篇

3.1. JAVA 并发知识库 3.2. JAVA 线程实现/创建方式 3.2.1. 继承 Thread 类 ​ Thread 类本质上是实现了 Runnable 接口的一个实例&#xff0c;代表一个线程的实例。启动线程的唯一方 法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法&#xff0c;它将…

java并发总结

一、并发基础 ㅤ 1、进程与线程 ㅤ 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 CPU&#xff0c;数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 I…

pytorch 图片分类,python 图片分类,resnet18 图片分类

pytorch 图片分类&#xff0c;python 图片分类&#xff0c;resnet18 图片分类&#xff0c;深度学习 图片分类 pytorch版本&#xff1a;1.5.0cu101 全部源码&#xff0c;可以直接运行。 下载地址&#xff1a;https://download.csdn.net/download/TangLingBo/12598435 网络是…

深度学习图片分类实战学习

开始记录学习深度学习的点点滴滴 深度学习图片分类实战学习 前言一、深度学习二、使用步骤1. 自建网络模型2. 进行深度学习的学习迁移 注意事项 前言 随着人工智能的不断发展&#xff0c;这门技术也越来越重要&#xff0c;很多人都开启了学习人工智能&#xff0c;本人开始记录…

关于图片的多标签分类(1)

最近还在处理人脸附件&#xff08;眼镜&#xff0c;刘海&#xff0c;口罩&#xff0c;帽子&#xff09;的multi-label分类。给自己普及一下常识性问题&#xff1a; 1&#xff09;什么是multi-label分类&#xff1f; multi-label分类&#xff0c;常见一张图片中可以存在多个目…

svm实现图片分类(python)

目录 前言 knn vs. svm svm & linear classifier bias trick loss function regularization optimization 代码主体 导入数据及预处理 svm计算loss_function和梯度 验证梯度公式是否正确 比较运行时间 svm训练及预测&#xff0c;结果可视化 通过corss-validat…

图片分类-python

目的&#xff1a;做一个简易的图片分类。 使用到的算法&#xff1a;hog、surfsvm 图片集&#xff1a;cifar-10、cifar-100、stl-10、自制图片集 分类完整代码链接 使用说明&#xff1a; 1.cifar-10、cifar-100和stl-10直接解压 2.自制图片集文件夹结构&#xff1a; ├…

CNN图片分类

最近在阅读一些AI项目&#xff0c;写入markdown&#xff0c;持续更新&#xff0c;算是之后也能回想起做法 项目 https://github.com/calssion/Fun_AI image classify(图片分类) CNN classify dogs and cats(猫狗二分类) Tutorial(教程):https://developers.google.com/mach…

深度学习之图像分类

第一篇CSDN文章&#xff0c;写的不好&#xff0c;还请各位大佬指正。万事开头难&#xff0c;千里之行始于足下&#xff01; 1.什么是图像分类 图像分类&#xff0c;核心是从给定的分类集合中给图像分配一个标签的任务。实际上&#xff0c;这意味着我们的任务是分析一个输入图…

关于图像分类

https://www.zhihu.com/question/57075015/answer/194397802https://www.zhihu.com/question/57075015/answer/194397802 先定义一下图像分类&#xff0c;一般而言&#xff0c;图像分类分为通用类别分类以及细粒度图像分类 那什么是通用类别以及细粒度类别呢&#xff1f;这里…

(一)图像分类任务介绍 Image Classification

目录 一、什么是图像分类任务&#xff1f;它有哪些应用场景&#xff1f; 二、图像分类任务的难点&#xff1f; 三、基于规则的方法是否可行&#xff1f; 四、什么是数据驱动的图像分类范式&#xff1f; 数据集构建 分类器设计与学习 分类器决策 五、常用的分类任务评价指…

图像分类的数据集

图像分类的数据集 1. MNIST2. Fashion-MNIST3.CIFAR-10和CIFAR-1004. Caltech 1015. ImageNet5.1 ImageNet是什么&#xff1f;5.2 ILSVRC 6. 各个数据集上的最新进展其他参考资料 1. MNIST MNIST数据集的一个样例 一般机器学习框架都使用MNIST作为入门&#xff0c;就像"He…

机器学习——图像分类

1 图像分类的概念 1.1 什么是图像分类&#xff1f; 图像分类&#xff0c;根据图像信息中所反映出来的不同特征&#xff0c;把不同类别的目标区分开来的图像处理方法 1.2 图像分类的难度 ●任何拍摄情 况的改变都将提升分类的难度 1.3 CNN如何进行图像分类 ●数据驱动型方法通…