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

news/2024/5/20 9:27:31 标签: 后端, java, jvm, juc, Future

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

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

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

类信息 

CompletableFuture

Future 

比较 

代码展示1

java">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.niftyadmin.cn/n/5197436.html

相关文章

opencv将32位深图片合成视频跳帧解决办法

在合成视频时候&#xff0c;大多数的图片都是24位深度的&#xff08;即RGB三通道&#xff0c;一个通道8位&#xff09;&#xff0c;但是也存在少量的32位深的图片&#xff08;RGBA&#xff0c;三个颜色通道加上A这个透明度通道&#xff09;&#xff0c;32位和24位的格式是不一样…

2023亚太杯数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其…

kernel32.dll丢失都有什么解决办法,帮助大家解决kernel32.dll丢失的问题

kernel32.dll丢失是电脑中常出现的情况&#xff0c;今天就想和大脚聊聊这个kernel32.dll 文件&#xff0c;这个文件它的功能是干什么的&#xff0c;如果电脑中kernel32.dll 丢失都有什么解决办法&#xff0c;帮助大家解决kernel32.dll丢失的问题&#xff0c;本篇文章给大家提供…

Paging3的使用踩坑记录

一、Paging3介绍 Paging3是jetpack推出的一个分页加载库&#xff0c;用于方便开发者实现分页加载功能&#xff0c;支持显示加载状态&#xff0c;重试机制&#xff0c;支持协程与RxJava结合使用&#xff0c;相对于传统的分页加载方案&#xff0c;我们不需要关注recyclerview的滑…

97.qt qml-自定义Table之实现ctrl与shift多选

我们之前实现了:93.qt qml-自定义Table优化(新增:水平拖拽/缩放自适应/选择使能/自定义委托)-CSDN博客 实现选择使能的时候,我们只能一行行去点击选中,非常麻烦,所以本章我们实现ctrl多选与shift多选、 所以在Table控件新增两个属性: 1.实现介绍 ctrl多选实现原理:当我…

滚珠螺杆在航天工业领域中的重要性

滚珠螺杆是重要的航天工业配件之一&#xff0c;在航天工业领域中具有非常重要的地位和作用。 首先&#xff0c;滚珠螺杆作为一种高精度、高刚度的传动元件&#xff0c;能够提供准确的传动和定位精度&#xff0c;从而保证航天器的可靠性和性能。航天器在飞行过程中需要精确控制其…

Vue3 项目修改index.html的 title

实现思路 通过插件 vite-plugins-html 进行参数配置&#xff0c;html 中使用参数&#xff0c;实现配置安装插件 $ npm install vite-plugins-html --save-devvite.config.js 中的配置 // 可以动态处理html文件内容的 import { createHtmlPlugin } from vite-plugin-htmlexpo…

找不到模块 “path“ 或其相对应的类型声明

安装 npm install types/node --save-dev 就可以了&#xff01;&#xff01;