Java8使用CompletableFuture实现多异步任务同步等待结果

news2024/12/27 14:06:17

一、应用场景

        在实际的开发工作中,我们可能会遇到一些比较复杂且耗时的功能,例如一个业务数据表格的导出,假定业务数据表本身都很大,需要组装的数据又比较多,就会造成整个实现过程很耗时甚至可能出现接口请求超时;这个时候我们会想到把过程中耗时的查询和数据处理通过异步的方式来提升执行效率,但一些查询数据的组装需要等待结果再进行下一步处理,这个时候就要用到Java8引入的新特性:CompletableFuture

二、使用方法

假设现在有个接口,其中有3个比较耗时的查询:getSomething1()、getSomething2()、getSomething3();同步执行所需的时间即3个查询所需时间之和;使用CompletableFuture实现异步执行,等待所有查询结果,所需时间则为3个查询中最大的时间, 如下的示例中,3个查询共需要6秒,使用CompletableFuture优化后仅需3秒!

特别提醒:在使用CompletableFuture启动线程去执行任务后,切忌立马下一行调用get()方法,这样会阻塞线程,会导致多个CompletableFuture任务之间挨个等待,又变回同步执行了!

import cn.hutool.core.date.DateUtil;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureTest {


    public static void main(String[] args) throws InterruptedException, ExecutionException {

        System.out.println("同步执行任务开始时间:" + DateUtil.now());
        String something1 = getSomething1();
        String something2 = getSomething2();
        String something3 = getSomething3();

        System.out.println("getSomething1() : " + something1);
        System.out.println("getSomething2() : " + something2);
        System.out.println("getSomething3() : " + something3);
        System.out.println("同步执行任务结束时间:" + DateUtil.now());

        System.out.println();

        System.out.println("异步执行任务开始时间:" + DateUtil.now());
        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(CompletableFutureTest::getSomething1);
        CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(CompletableFutureTest::getSomething2);
        CompletableFuture<String> cf3 = CompletableFuture.supplyAsync(CompletableFutureTest::getSomething3);
        System.out.println("getSomething1() : " + cf1.get());
        System.out.println("getSomething2() : " + cf2.get());
        System.out.println("getSomething3() : " + cf3.get());
        System.out.println("异步执行任务结束时间:" + DateUtil.now());




    }


    public static String getSomething1()  {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "getSomething1";
    }

    public static String getSomething2()  {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "getSomething2";
    }

    public static String getSomething3() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "getSomething3";
    }


}

控制台执行结果: 

​​​​​​​

在实际开发中使用,推荐使用线程池去执行异步任务,supplyAsync()重载的方法中有支持线程池对象参数,快去体验吧!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 之 MediaPlayer 播放音频与视频

本节引言&#xff1a; 本节带来的是Android多媒体中的——MediaPlayer&#xff0c;我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件&#xff0c;通过该类&#xff0c;我们可以以最小的步骤来获取&#xff0c;解码 和播放音视频。它支持三种不同的…

Carla教程三:参考线平滑理论完全解析(二次规划)

参考线平滑理论 决策规划流程第一步是参考线的生成&#xff0c;然后将障碍物进行投影到以参考线为坐标轴的frenet坐标系。参考线是很关键的一部&#xff0c;解决了导航路径过长&#xff0c;不平滑&#xff0c;不利于坐标转换找匹配点的问题。利用参考线&#xff0c;每一个规划…

LeetCode 2050. Parallel Courses III【记忆化搜索,动态规划,拓扑排序】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

适用于 Windows 10/11 的 10 款最佳免费 PDF 阅读器软件

PDF 文档非常受欢迎&#xff0c;因为它们可以在任何操作系统上打开&#xff0c;并且很容易附加到电子邮件、消息或网站中。PDF 文档还具有不易更改的优点。因此&#xff0c;它被个人和组织广泛用于简历、学习材料、文档以及外围设备和设备手册的数字副本。 PDF 阅读器软件可帮…

【JavaEE初阶】Servlet (三)MessageWall

在我们之前博客中写到的留言墙页面,有很严重的问题:(留言墙博客) 如果刷新页面/关闭页面重开,之前输入的消息就不见了.如果一个机器上输入了数据,第二个机器上是看不到的. 针对以上问题,我们的解决思如如下: 让服务器来存储用户提交的数据,由服务器保存. 当有新的浏览器打开页…

Python 基础(十七):库

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬 文章目录 一、Python库的概念二、常用标准库2.1、数字和数学2.2、文件和目录操作2.3、时间和日期2.4、网络通信2.5、并发和多线程2.6、数据压缩和归档2.7、数据序列化…

深度专访盖国强丨《TVP技术指针:共创国产数据库的“中国时刻”》

日前&#xff0c;腾讯云《TVP技术指针》栏目对云和恩墨创始人盖国强进行了深度专访。从专业DBA到创立云和恩墨公司&#xff0c;从 Oracle ACE 国内第一人到国产数据库的践行者&#xff0c;伴随中国数据库成长的二十年&#xff0c;他有哪些思考、判断、行动和远见&#xff1f;在…

苍穹外卖-day05

苍穹外卖-day05 本项目学自黑马程序员的《苍穹外卖》项目&#xff0c;是瑞吉外卖的Plus版本 功能更多&#xff0c;更加丰富。 结合资料&#xff0c;和自己对学习过程中的一些看法和问题解决情况上传课件笔记 视频&#xff1a;https://www.bilibili.com/video/BV1TP411v7v6/?sp…

深入浅出对话系统——可控文本生成

引言 主要是介绍一篇引用800的论文 CTRL: A Conditional Transformer Language Model for Controllable Generation 它的Pytorch源码在 https://huggingface.co/transformers/v3.1.0/_modules/transformers/modeling_ctrl.html 主要思想是通过加入控制代码(control code)来控…

空中出租车运营公司【Flewber Global】申请纳斯达克IPO上市

猛兽财经获悉&#xff0c;总部位于美国纽约的空中出租车运营公司Flewber Global Inc&#xff0c;近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为&#xff08;FLYF&#xff09;,Flewber Global计划通…

[语义分割] DeepLab v2(膨胀卷积、空洞卷积、多尺度信息融合、MSc、ASPP、空洞空间金字塔池化、Step学习率策略、Poly学习率策略)

DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs 论文地址&#xff1a;DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs源码地址&…

大数据的兴起

目录 1.什么是大数据 2.大数据的具体应用 3.大数据的便利性 4.大数据的危害 1.什么是大数据 大数据是指规模庞大、复杂多样的数据集合&#xff0c;无法用传统的处理方法进行管理、处理和分析的一种数据类型。这些数据集合通常包括结构化数据&#xff08;如数据库中的表格&am…

CEC2022代码(Matlab代码)及多种智能优化算法求解CEC2022

一、CEC2022测试函数 CEC2022测试集共有12个单目标测试函数&#xff0c;每个测试函数可选择的维度分别为10维、20维。该测试集合也是目前高质量论文应用最广泛的测试集&#xff0c;CEC2022测试集函数复杂&#xff0c;非常具有挑战力。 CEC2022测试函数与理论最优值 二、多种智…

Vcenter安全加固-防火墙-只允许特定的IP地址访问Vcenter

一、场景 1.只允许特定的IP地址访问Vcenter。 2、其余全部拒绝。 二、操作步骤 1、登录Vcenter管理界面 https://<Vcenter-ip>:5480 2、点击防火墙-添加 3、添加规则 1、先添加允许访问的IP地址和掩码。 1、先放你的Esxi主机管理地址&#xff0c;不然会托管。 2、…

CTF —— 网络安全大赛

前言 随着大数据、人工智能的发展&#xff0c;人们步入了新的时代&#xff0c;逐渐走上科技的巅峰。 \ ⚔科技是一把双刃剑&#xff0c;网络安全不容忽视&#xff0c;人们的隐私在大数据面前暴露无遗&#xff0c;账户被盗、资金损失、网络诈骗、隐私泄露&#xff0c;种种迹象…

Redhat7/CentOS7 网络配置与管理(nmtui、nmcli、GNOME GUI、ifcfg文件、IP命令)

背景&#xff1a;作为系统管理员&#xff0c;需要经常处理主机网络问题&#xff0c;而配置与管理网络的方法和工具也有好几种&#xff0c;这里整理分享一下网络配置与管理的几种方式。 1、NetworkManager 概述 在 Red Hat Enterprise Linux 7 中&#xff0c;默认网络服务由 N…

LightGlue论文翻译

LightGlue:光速下的局部特征匹配 摘要 - 我们介绍 LightGlue&#xff0c;一个深度神经网络&#xff0c;学习匹配图像中的局部特征。我们重新审视 SuperGlue 的多重设计决策&#xff0c;稀疏匹配的最新技术&#xff0c;并得出简单而有效的改进。累积起来&#xff0c;它们使 Lig…

KafKa脚本操作

所有操作位于/usr/local/kafka_2.12-3.5.1/bin。 rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# pwd /usr/local/kafka_2.12-3.5.1/bin rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# ls connect-distributed.sh kafka-delegation-tokens.sh kafka-mirror-mak…

PHP使用Redis实战实录1:宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案

宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案 前言一、Redis安装部署1.安装Redis2.php安装Redis扩展3.启动Redis 二、避坑指南1.6379端口配置2.Redis服务启动&#xff08;1&#xff09;Redis服务启动失败&#xff08;2&#xff09;Redis启动日志排查&#xff08;3&a…

使用云服务器和Frp(快速反向代理)框架快速部署实现内网穿透

目录 一. 背景1.1 内网穿透1.2 Frp介绍1.3 Frp配置流程 二. 云服务器配置2.1 配置安全组2.2 编写frps.ini 三. 内网主机配置3.1 编辑frpc.ini文件3.2 启动服务并配置开机自启动 四. 参考文献 一. 背景 现在有一台ubuntu云服务器&#xff0c;我想通过内网穿透将一台内网的主机当…