当异步任务汇聚,你该如何选择:CountDownLatch 与 CompletableFuture 对比

当我们需要执行多个异步任务,并且需要等待它们全部完成才可以继续时,可以使用以下两种实现方案:

一、方案

方案一:CountDownLatch

CountDownLatch是一个同步工具类,可以用来实现多个线程之间的同步。它可以让一个线程等待其他线程完成某些工作后再继续执行。

实现方案如下:

import java.util.concurrent.CountDownLatch;

public class CountDownLatchDemo {

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3);

        // 启动三个线程执行任务
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                // 执行任务
                System.out.println(Thread.currentThread().getName() + " 执行任务");
                latch.countDown();
            }).start();
        }

        // 阻塞着,等待所有任务完成
        latch.await();

        // 所有任务完成后,继续执行
        System.out.println("所有任务完成");
    }
}

输出结果:

Thread-1 执行任务
Thread-0 执行任务
Thread-2 执行任务
所有任务完成

方案二:CompletableFuture

CompletableFuture是一个异步编程的工具类,可以用来执行异步任务并获取任务执行结果。

实现方案如下:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CompletableFutureDemo {

    public static void main(String[] args) throws InterruptedException, 
    ExecutionException {
        // 创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        // 启动三个异步任务
        CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
            // 执行任务1
            System.out.println("任务1 执行");
        }, executorService);
        CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {
            // 执行任务2
            System.out.println("任务2 执行");
        }, executorService);
        CompletableFuture<Void> future3 = CompletableFuture.runAsync(() -> {
            // 执行任务3
            System.out.println("任务3 执行");
        }, executorService);

        // 等待所有任务完成
        CompletableFuture.allOf(future1, future2, future3).get();

        // 所有任务完成后,继续执行
        System.out.println("所有任务完成");
    }
}

如果任务比较多的情况下就可以使用数组列表来存储创建的任务,CompletableFuture.allOf接收的是CompletableFuture<?>[]数组。

输出结果:

任务1 执行
任务2 执行
任务3 执行
所有任务完成
  • CountDownLatch 方案中,我们使用 latch.await() 方法来等待所有任务完成。
  • CompletableFuture 方案中,我们使用 CompletableFuture.allOf() 方法来等待所有任务完成。

两种方案各有优缺点:

  • CountDownLatch 方案简单易用,但需要额外创建一个 CountDownLatch 对象。
  • CompletableFuture 方案可以获取任务的执行结果,但需要额外创建一个 CompletableFuture 对象。

在实际使用中,可以根据具体需求选择合适的方案。

二、CountDownLatch vs CompletableFuture


CountDownLatch 和 CompletableFuture 都是用于在多线程环境中同步线程的工具。它们都具有各自的优缺点,适用于不同的场景。

特性

CountDownLatch

CompletableFuture

功能

简单的同步

丰富的同步、异步、通信功能

使用难度

简单

复杂

适用场景

简单的同步场景

各种同步、异步场景

CountDownLatch

CountDownLatch 是一个计数器,它可以让一个线程等待其他线程完成某些操作。CountDownLatch 的计数器初始值为某个整数,当计数器的值减为 0 时,所有等待的线程都会被唤醒。

CountDownLatch 的优点是简单易用,适用于一些简单的同步场景。例如,可以使用 CountDownLatch 来实现线程池的启动和关闭。

CountDownLatch 的缺点是它只能实现简单的同步场景。例如,如果需要在多个线程之间传递数据,CountDownLatch 就无法实现。

CompletableFuture

CompletableFuture 是一个异步任务处理框架,它可以用于在多线程环境中异步执行任务、同步多个异步任务的结果、以及实现线程间通信等。

CompletableFuture 的优点是功能丰富,适用于各种同步场景。例如,可以使用 CompletableFuture 来实现线程池的异步执行、多个异步任务的结果同步、以及线程间数据传递等。

CompletableFuture 的缺点是使用起来比较复杂,需要一定的学习成本。

三、相关题目

  1. CountDownLatch 的使用场景有哪些?

答案:CountDownLatch 可以用于以下场景:

  • 等待其他线程完成任务后再执行某些操作。例如,可以使用 CountDownLatch 来实现线程池的启动和关闭。
  • 让多个线程同步执行某些操作。例如,可以使用 CountDownLatch 来实现多个线程并发读取文件。

2.CompletableFuture 是什么?

答案:CompletableFuture 是一个异步任务处理框架,它可以用于在多线程环境中异步执行任务、同步多个异步任务的结果、以及实现线程间通信等。​​​​​​​

3.CompletableFuture 的使用场景有哪些?

答案:CompletableFuture 可以用于以下场景:

  • 异步执行任务。例如,可以使用 CompletableFuture 来实现异步 HTTP 请求。
  • 同步多个异步任务的结果。例如,可以使用 CompletableFuture 来实现多个线程并发计算的结果求和。
  • 实现线程间通信。例如,可以使用 CompletableFuture 来实现线程间的数据传递。

4.CompletableFuture 的常用方法有哪些?

答案:CompletableFuture 提供了丰富的 API,常用的方法包括:

  • thenApply():将当前 CompletableFuture 的结果作为参数传递给一个函数,并将函数的结果作为新的 CompletableFuture。
  • thenAccept():将当前 CompletableFuture 的结果作为参数传递给一个函数,但不返回任何结果。
  • thenRun():不依赖当前 CompletableFuture 的结果,执行一个函数。
  • allOf():将多个 CompletableFuture 组合成一个新的 CompletableFuture,只有当所有 CompletableFuture 都完成时,新的 CompletableFuture 才会完成。
  • anyOf():将多个 CompletableFuture 组合成一个新的 CompletableFuture,当任意一个 CompletableFuture 完成时,新的 CompletableFuture 就会完成。

5.CompletableFuture 的异常处理机制是怎样的?

答案:CompletableFuture 的异常处理机制如下:

  • 如果 CompletableFuture 的执行过程中抛出异常,则异常会被封装在一个 CompletionException 中,并传递给 thenApply()、thenAccept() 等方法。
  • 如果 CompletableFuture 的执行过程中没有抛出异常,则 thenApply()、thenAccept() 等方法不会抛出异常。

6.CompletableFuture 和 CountDownLatch 的区别是什么?

答案:CompletableFuture 和 CountDownLatch 都是用于在多线程环境中同步线程的工具,但它们有以下区别:

  • 功能:CompletableFuture 具有更丰富的功能,可以用于异步执行任务、同步多个异步任务的结果、以及实现线程间通信等,而 CountDownLatch 只能用于简单的同步场景。
  • 使用难度:CompletableFuture 的使用难度比 CountDownLatch 高,需要一定的学习成本。
  • 适用场景:CompletableFuture 适用于各种同步场景,而 CountDownLatch 适用于简单的同步场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/208270.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023最新软件测试八股文,你背得怎样了

今天给大家分享软件测试面试题基础篇&#xff0c;看看大家能答对几题 1、软件测试方法有哪些分类?各自有什么特点?设计测试用例的主要方法有哪些? 白盒: 测试人员利用程序内部的逻辑结构及相关信息&#xff0c;设计或选择型试用例:对程序所有的逻辑路径进行测试。 黑盒: …

【C++】异常抛出变量的生命周期

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。搜…

【Java8系列07】Java8日期处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

java+springboot学生宿舍公寓管理系统xueshenggongy

经过查阅资料和调查统计发现&#xff0c;高校学生宿舍管理工作变得越来越繁重和琐碎&#xff0c;如在学生住宿安排&#xff08;特别是新生住宿安排&#xff09;、宿舍大幅调换、公共设施统计维护、宿舍杂费统计收取、宿舍卫生管理统计、出入登记记录等各个方法存在着大量问题和…

【小布_ORACLE笔记】Part11-1--RMAN Backups

Oracle的数据备份于恢复RMAN Backups 学习第11章需要掌握&#xff1a; 一.RMAN的备份类型 二.使用backup命令创建备份集 三.创建备份文件 四.备份归档日志文件 五.使用RMAN的copy命令创建镜像拷贝 文章目录 Oracle的数据备份于恢复RMAN Backups1.RMAN Backup Concepts&#x…

二叉树展开为链表的三种写法

二叉树展开为链表 链表头节点法 新建一个树形链表&#xff0c;前序遍历这个树&#xff0c;遍历到一个节点就往里插 class Solution {TreeNode dummyNode new TreeNode(0,null,null);TreeNode p dummyNode;public void flatten(TreeNode root) {if(root null) return;//线序…

Hi-Net:用于多模态MR图像合成的混合融合网络

Hi-Net: Hybrid-Fusion Network for Multi-Modal MR Image Synthesis Hi-Net&#xff1a;用于多模态MR图像合成的混合融合网络背景贡献实验方法the modality-specific network&#xff08;模态特定网络&#xff09;multi-modal fusion networkmulti-modal synthesis network 损…

【投稿优惠|稳定出版】2023年信息科学和大数据应用国际会议 (ICISBDA 2023)

2023年信息科学和大数据应用国际会议 (ICISBDA 2023&#xff09; 2023 International Conference on Information Science and Big Data Applications &#xff08;ICISBDA 2023&#xff09; 一、会议简介 &#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&…

规则引擎专题---1、什么是规则引擎

什么是规则引擎&#xff0c;为了更易大家理解&#xff0c;我们这边先抛出一个问题。 问题 现有一个在线申请信用卡的业务场景&#xff0c;用户需要录入个人信息&#xff0c;如下图所示&#xff1a; 通过上图可以看到&#xff0c;用户录入的个人信息包括姓名、性别、年龄、学…

Fiddler抓包工具之fiddler的介绍及安装

Fiddler简介 Fiddler是比较好用的web代理调试工具之一&#xff0c;它能记录并检查所有客户端与服务端的HTTP/HTTPS请求&#xff0c;能够设置断点&#xff0c;篡改及伪造Request/Response的数据&#xff0c;修改hosts&#xff0c;限制网速&#xff0c;http请求性能统计&#xff…

Codeforces Round #911 (Div. 2) A~E

A.Cover in Water&#xff08;思维&#xff09; 题意&#xff1a; 有一个 1 n 1 \times n 1n的水池&#xff0c;里面有些格子可以加水&#xff0c;有些格子是被堵上的&#xff0c;你可以进行以下两种操作&#xff1a; 1.往一个空的格子里加水 2.移除一个有水的格子中的水&a…

论文阅读_AI生成检测_Ghostbuster

英文名称: Ghostbuster: Detecting Text Ghostwritten by Large Language Models 中文名称: 捉鬼人&#xff1a;检测大语言模型生成的文本 文章: http://arxiv.org/abs/2305.15047 代码: https://github.com/vivek3141/ghostbuster 作者: Vivek Verma&#xff0c;Eve Fleisig&a…

人工智能基础创新的第二增长曲线

编者按&#xff1a;2023年是微软亚洲研究院建院25周年。借此机会&#xff0c;我们特别策划了“智启未来”系列文章&#xff0c;邀请到微软亚洲研究院不同研究领域的领军人物&#xff0c;以署名文章的形式分享他们对人工智能、计算机及其交叉学科领域的观点洞察及前沿展望。希望…

docker-compose脚本编写及常用命令

安装 linux DOCKER_CONFIG/usr/local/lib/docker/cli-plugins sudo mkdir -p $DOCKER_CONFIG/cli-plugins sudo curl -SL https://521github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose sudo c…

VSCode下载安装教程+安装插件

一、vscode下载安装 1.打开 官网&#xff1a;https://code.visualstudio.com/Download 2.选择跟你电脑相对应的版本下载&#xff0c;我是win10&#xff0c;所以选择如下&#xff1a; 3.下载到你想要保存的目录下 4.下载完成后打开目录&#xff0c;双击安装包 5. 同意&#xff…

Linux 磁盘分区处理

最近实施过程中遇到客户提供给我们的服务器操作系统和Docke容器环境都已经安装完成&#xff0c;但磁盘的分区没有进行整理好。磁盘总共270G&#xff0c;系统安装分配了60G&#xff0c;剩余未创建分配需要处理。由于分区情况每家不一样&#xff0c;但大致流程都是相同的&#xf…

React项目使用NProgress作为加载进度条

React项目使用NProgress作为加载进度条 0、效果1、react安装依赖2、使用3.进度条颜色设置 文档参考&#xff1a;https://zhuanlan.zhihu.com/p/616245086?utm_id0 0、效果 如下&#xff0c;可全局在页面顶部有一条进度条 1、react安装依赖 yarn add nprogress通过以上安装…

uni-app+ts----微信小程序锚点定位 、自动吸顶、滚动自动选择对应的锚点(点击tab跳转对应的元素位置)

uni-app----微信小程序锚点定位 、自动吸顶、滚动自动选择对应的锚点&#xff08;点击tab跳转对应的元素位置&#xff09; html代码部分 重点是给元素加入【 :id“‘item’ item.id”】 <view class"radiusz bg-white pt-[30rpx] z-[999]"><u-tabs:list&q…

matlab 无迹卡尔曼滤波

1、内容简介 略 26-可以交流、咨询、答疑 2、内容说明 无迹卡尔曼滤波 无迹卡尔曼滤波 无迹卡尔曼滤波 3、仿真分析 %该文件用于编写无迹卡尔曼滤波算法及其测试 %注解&#xff1a;主要子程序包括&#xff1a;轨迹发生器、系统方程 % 测量方程、UKF滤波器 %----…

YOLOv8优化策略:SENetV2,squeeze和excitation全面升级,效果优于SENet | 2023年11月最新成果

🚀🚀🚀本文改进: SENetV2,squeeze和excitation全面升级,作为注意力机制引入到YOLOv8,放入不同网络位置实现涨点 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.SENetV2 论文:https://arxiv.org/…