CompletableFuture.join() vs Future.get(),开发中哪个更好

news2024/9/23 5:29:36

CompletableFuture和Future都是Java中的接口,用于异步编程和并发处理。

Future表示一种异步计算的结果,可以通过get()方法获取计算结果或等待计算的完成。但是,如果计算还未完成,get()方法会阻塞线程,这会影响并发性能。此外,Future只能描述单个异步计算过程,无法组合多个任务的结果。

而CompletableFuture是Future的增强版本,在保留Future的基本功能的同时,还提供了更加方便的方法以支持异步操作的组合和链式调用。CompletableFuture可以将多个异步操作组合成一个新的异步计算,并通过回调方式处理结果,无需阻塞线程。

类信息 

CompletableFuture

Future 

比较 

代码展示1

public class FutureExample {

    static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(16, 32, 5, TimeUnit.HOURS, new LinkedBlockingQueue<>());
    public static void processFutures(List<CompletableFuture<String>> futureList) {
        for (CompletableFuture<String> future : futureList) {
            // 使用join()方法等待每个Future对象的结果,不会阻塞当前线程
            try {
                String result = future.join();
//                System.out.println("Future result: " + result);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        long millis = System.currentTimeMillis();
        List<CompletableFuture<String>> futureList = new ArrayList<>();
        for (int i = 0; i < 10000000; i++) {
            int finalI = i;
            futureList.add(CompletableFuture.supplyAsync(() -> ("Result " + finalI)));
        }
        processFutures(futureList);
        System.out.println("join-----------------------" + (System.currentTimeMillis() - millis));

        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(15, 50, 5, TimeUnit.HOURS, new LinkedBlockingQueue<>());

        long millis2 = System.currentTimeMillis();
        List<Future> futures = new ArrayList<>();
        for (int i = 0; i < 10000000; i++) {
            int finalI = i;
            futures.add(threadPool.submit(() -> ("Result " + finalI)));
        }

        for (Future future : futures) {
            Object o = future.get();
//            System.out.println(o.toString());
        }
        System.out.println("get-----------------------" + (System.currentTimeMillis() - millis2));
    }
}

结果1

 代码展示2

修改线程池的第一个参数为32

结果2

 

 代码展示3

修改线程池的第二个参数为64

结果3

结论

在性能方面,CompletableFuture.join()和Future.get()的速度差异不大。它们都是阻塞方法,会等待异步任务完成并返回结果。具体哪一个更快取决于具体的使用场景和实现方式。

然而,CompletableFuture.join()相对于Future.get()有一个优点,就是它可以更方便地进行异常处理。如果异步任务抛出了异常,CompletableFuture.join()会将异常封装为CompletionException并抛出,而Future.get()则需要在调用get()方法之前显式地调用getException()方法来获取异常信息。

另外,CompletableFuture.join()还可以与其他CompletableFuture实例进行组合操作,实现更为复杂的异步任务处理。而Future.get()则只能用于获取单个异步任务的结果。

综上所述,虽然CompletableFuture.join()和Future.get()在性能上没有明显差异,但是在功能和使用方式上,CompletableFuture.join()更为灵活和方便。

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

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

相关文章

虾皮台湾站点什么好卖

在如今的电商时代&#xff0c;越来越多的人选择通过网购来满足购物需求。而中国台湾地区作为一个充满机遇的市场&#xff0c;吸引了许多商家的目光。虾皮作为台湾地区最大的电商平台之一&#xff0c;为卖家提供了丰富的销售机会。但是&#xff0c;卖家们在选择什么产品来销售时…

文档明明在桌面上却不显示?5个方法轻松解决!

“我之前保存文档的时候明明选择保存在桌面&#xff0c;上次看的时候文件还在&#xff0c;但是今天打开电脑后发现我保存在桌面的文档不见了&#xff0c;这是为什么呢&#xff1f;还有机会找回我的文件吗&#xff1f;” 在日常使用电脑时&#xff0c;有些用户为了方便&#xff…

大势智慧代理商体系持续开疆拓土,全国代理火热招募中...

11月15日&#xff0c;武汉大势智慧科技有限公司&#xff08;后简称“大势智慧”&#xff09;与上海宝天信息科技有限公司&#xff08;后简称“宝天信息”&#xff09;金牌代理商签约授牌仪式成功举行。大势智慧副总裁周济安先生、宝天信息经理王芳女士分别作为双方签约代表出席…

virtuoso 后仿 ADE L error

ADE后仿时出现error ERROR (SFE-23): "input.scs" 299: The instance _57_D32_noxref is referencing an undefined model or subcircuit, parasitic_nwd. Either include the file containing the definition of parasitic_nwd, or define parasitic_nwd before run…

STM32定时器输入捕获测量高电平时间

STM32定时器输入捕获测量高电平时间 输入捕获测量高电平时间CuebMX配置代码部分 本篇内容要求读者对STM32通用定时器有一点理解&#xff0c;如有不解&#xff0c;请看 夜深人静学32系列15——通用定时器 输入捕获 输入捕获是STM32通用定时器的一种功能&#xff0c;可以捕获特定…

mysql数据库【进阶篇】

1.存储引擎 1.1 mysql的体系结构 连接层&#xff1a;最上层是一些客户端和链接服务&#xff0c;主要完成- -些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层&#xff1a;第二层架构主要完成大多数的核心服务功…

Scrum敏捷开发培训团队和组织来说的重要性

Scrum敏捷开发培训对于团队和组织来说是至关重要的&#xff0c;有以下几点&#xff0c;大家可以参考下&#xff1a; 理解敏捷价值观和原则&#xff1a; 培训有助于团队理解敏捷方法背后的核心理念和价值观&#xff0c;包括个体和互动、工作软件、客户合作和响应变化。这有助于建…

解决Spring Boot应用在Kubernetes上健康检查接口返回OUT_OF_SERVICE的问题

现象 在将Spring Boot应用部署到Kubernetes上时&#xff0c;健康检查接口/actuator/health返回的状态为{"status":"OUT_OF_SERVICE","groups":["liveness","readiness"]}&#xff0c;而期望的是返回正常的健康状态。值得注…

单脉冲测角-和差比幅法-方向图传播因子-函数编写

方向图传播因子-函数编写 和差比幅法单脉冲测角原理代码仿真结果参数说明 和差比幅法单脉冲测角原理 有关单脉冲测角和差比幅法的原理已经在博文单脉冲测角-和差比幅法中详细介绍了&#xff0c;我们在实际仿真的时候&#xff0c;往往需要在给定来波方向下方向图转化因子&#…

关于代码混淆,看这篇就够了

​ 代码混淆一.基本概念java的bytecode很容易通过JAD等反编译工具还原出源代码。这样势必不满足安全的定义。如何一定程度上保护需要防止被反编译的源代码呢&#xff1f;混淆&#xff08;obfuscate&#xff09;技术。注意&#xff1a;用obfuscate防盗版是根本不可能&#xff0c…

java 实现发送邮箱,复制即用,包含邮箱设置第三方登录授权码获取方法

application.yml spring:profiles:active: dev # active: test#邮件附件上传文件大小限制servlet:multipart:max-file-size: 50MB #单个文件大小限制max-request-size: 100MB #总文件大小限制&#xff08;允许存储文件的文件夹大小&#xff09;mail:default-encoding: UTF…

[uni-app] uni.showToast 一闪而过问题/设定时间无效/1秒即逝

toast一闪就消失 1.猜测频繁点击导致 – 排除 2.猜测再定时器内导致-- 排除 3.和封装的接口调用一起导致 - 是改原因 深挖发现: axios封装中, 对loading/hindloading进行了配置, 看来是 showToast 与 loading等冲突导致的 wx.hideLoading(Object object) 解决办法 再封装的…

数据结构与算法之美学习笔记:23 | 二叉树基础(上):什么样的二叉树适合用数组来存储?

目录 前言树&#xff08;Tree&#xff09;二叉树&#xff08;Binary Tree&#xff09;二叉树的遍历解答开篇 & 内容小结 前言 本节课程思维导图&#xff1a; 前面我们讲的都是线性表结构&#xff0c;栈、队列、链表等等。今天我们讲一种非线性表结构&#xff0c;树。问题&…

开源免费的流程设计器如何选型

大家在开发OA办公自动化、ERP、CRM、BPM、低代码平台等项目的时候&#xff0c;经常用到流程引擎&#xff0c;目前主流的开源流程引擎有activiti、flowable、camunda。这几个开源的流程引擎均基于BPMN2.0国际规范标准&#xff0c;其功能均比较强大&#xff0c;接口也很丰富。但涉…

远程数据采集继电器RTU如何应用在智能电动汽车充电桩

远程数据采集继电器&#xff08;Remote Terminal Unit&#xff0c;RTU&#xff09;在智能电动汽车充电桩中的应用&#xff0c;可以为充电桩系统提供更高效、安全和可靠的远程监控与控制功能。下面将详细说明RTU在智能电动汽车充电桩中的应用。 远程监控功能&#xff1a; RTU可以…

找不到msvcp110.dll怎么办,msvcp110.dll丢失的修复方法

您可能已经碰见过这样的情况&#xff0c;当您试图打开某个软件时&#xff0c;屏幕上突然跳出一个提示窗口&#xff0c;告诉您 “找不到msvcp110.dll”&#xff0c;“msvcp110.dll丢失”。遇到这种情况是不是让人很焦头烂额呀&#xff1f;别担心&#xff0c;接下来我就为您提供几…

NX二次开发UF_CAM_ask_clear_plane_tag 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_clear_plane_tag Defined in: uf_cam_planes.h int UF_CAM_ask_clear_plane_tag(tag_t object_tag, tag_t * target_tag ) overview 概述 Query the tag of a clearance plane 查询清洁…

使用低代码可视化开发平台快速搭建应用

目录 一、JNPF可视化平台介绍 二、搭建JNPF可视化平台 【表单设计】 【报表设计】 【流程设计】 【代码生成器】 三、使用JNPF可视化平台 1.前后端分离&#xff1a; 2.多数据源&#xff1a; 3.预置功能&#xff1a; 4.私有化部署&#xff1a; 四、总结 可视化低代码…

Spring:IoC,AOP,SpringEL表达式

IoC容器 IoC &#xff0c;Spring全家桶各个功能模块的基础&#xff0c;是创建对象的容器。 IoC概念 控制反转&#xff0c;将对象的创建进行反转&#xff0c;常规情况下对象由开发者手动创建&#xff0c;而使用IoC不再需要创建对象&#xff0c;由IoC容器根据需求自动创建项目…

ESP32C3小飞控调试

ESP32C3小飞控调试 - 1 ESP32C3小飞控板赶在国庆节前发出打样&#xff0c;假期后上班就收到了样板&#xff0c;但是迟迟没有动手调试&#xff0c;这两天终于抽出时间调试了&#xff0c;调试过程还算顺利&#xff0c;基本没有遇到什么大问题&#xff0c;下面记录一下调试过程。…