返回顶部
首页 > 资讯 > 后端开发 > JAVA >CompletableFuture的使用
  • 766
分享到

CompletableFuture的使用

java 2023-09-01 14:09:39 766人浏览 八月长安
摘要

目录 一、前言 二、概念介绍  三、自身特性 四、使用方式 1、异步执行一个任务并获取结果 2、异步执行一个任务并处理异常 3、异步执行多个任务并合并结果 4、异步执行多个任务并处理其中一个任务的结果 5、串行执行多个任务 6、 检查异步任

目录

一、前言

二、概念介绍 

三、自身特性

四、使用方式

1、异步执行一个任务并获取结果

2、异步执行一个任务并处理异常

3、异步执行多个任务并合并结果

4、异步执行多个任务并处理其中一个任务的结果

5、串行执行多个任务

6、 检查异步任务是否执行完成和执行回调

五、使用场景


一、前言

现在大部分的CPU都是多核,我们都知道想要提升我们应用程序的运行效率,就必须得充分利用多核CPU的计算能力;Java为我们提供了大量多线程api,使用它们可以让我们的代码避免同步阻塞,进而达到提升运行效率的目的,CompletableFuture就是其中一个非常强大且重要API,下面我们就来介绍一下CompletableFuture的概念和使用。

二、概念介绍 

CompletableFuture 是 Java 8 中新增的一个异步编程工具类,它是基于 Future 和 CompletionStage 接口构建的,可以与 Java 8 中的 Stream API 配合使用,也能够与 Java 9 中的 Reactive Stream API 进行交互。

主要用于异步执行任务并返回结果,实现异步计算和操作组合。它提供了一种灵活、可组合的方式来实现异步计算,同时也提供了异常处理、取消、超时等特性。在CompletableFuture中,我们可以通过回调函数来处理任务的结果,也可以使用其它方法来组合多个CompletableFuture对象,以构建更复杂的异步操作流水线。

三、自身特性

  1. 异步执行:CompletableFuture 可以在新的线程上异步执行计算或操作,从而不会阻塞主线程,提高程序的响应速度。

  2. 可组合性:CompletableFuture 的操作可以组合成一个或多个的 CompletableFuture 对象,从而构成复杂的异步计算链。

  3. 异常处理:CompletableFuture 可以对异常进行处理,通过 exceptionally() 方法可以捕获计算中的异常并返回默认值。

  4. 取消与超时:CompletableFuture 支持取消异步任务,还可以设置超时时间来避免任务的无限等待。

  5. 非阻塞式等待:CompletableFuture 提供了非阻塞式的等待方法,如 join() 和 getNow() 方法。

四、使用方式

1、异步执行一个任务并获取结果

通过 CompletableFuture 的静态方法 supplyAsync() 可以异步执行一个任务,返回 CompletableFuture 对象,通过该对象可以获取任务执行的结果。

CompletableFuture future = CompletableFuture.supplyAsync(() -> {    // 执行一些耗时的操作    return "Hello CompletableFuture";});String result = future.get(); // 阻塞等待任务执行完成并获取结果System.out.println(result);

2、异步执行一个任务并处理异常

CompletableFuture 提供了方法 handle() 来处理异步任务执行过程中的异常,它可以处理任务完成时的异常,也可以处理任务执行过程中的异常。

CompletableFuture future = CompletableFuture.supplyAsync(() -> {    // 执行一些可能会出现异常的操作    throw new RuntimeException("Something went wrong");}).handle((result, exception) -> {    if (exception != null) {        System.out.println("Task failed with exception: " + exception);        return "default value";    } else {        return result;    }});String result = future.get();System.out.println(result);

3、异步执行多个任务并合并结果

通过 CompletableFuture 的静态方法 allOf() 可以并行执行多个任务,等待所有任务完成后,通过 CompletableFuture.join() 方法合并所有任务的结果。

CompletableFuture future1 = CompletableFuture.supplyAsync(() -> "Hello");CompletableFuture future2 = CompletableFuture.supplyAsync(() -> "CompletableFuture");CompletableFuture future3 = CompletableFuture.supplyAsync(() -> "Java");CompletableFuture combinedFuture = CompletableFuture.allOf(future1, future2, future3);combinedFuture.get();String result = Stream.of(future1, future2, future3)        .map(CompletableFuture::join)        .collect(Collectors.joining(" "));System.out.println(result);

CompletableFuture 提供了三种方法来处理它们:handle()、whenComplete() 和 exceptionly()。这里就不做详细介绍了,有兴趣的朋友们可以自己去详细了解一下,以下为各种处理方式的比较结果。 

handle()whenComplete()exceptionly()
访问成功YesYesNo
访问失败YesYesYes
能从失败中恢复YesNoYes
能转换结果从T 到 UYesNoNo
成功时触发YesYesNo
失败时触发YesYesYes
有异步版本YesYesYes(12版本)

4、异步执行多个任务并处理其中一个任务的结果

通过 CompletableFuture 的静态方法 anyOf() 可以并行执行多个任务,只要有一个任务完成,就会立即返回其结果。

CompletableFuture future1 = CompletableFuture.supplyAsync(() -> {    try {        Thread.sleep(3000);    } catch (InterruptedException e) {        e.printStackTrace();    }    return "Result 1";});CompletableFuture future2 = CompletableFuture.supplyAsync(() -> "Result 2");CompletableFuture future3 = CompletableFuture.supplyAsync(() -> "Result 3");CompletableFuture anyOfFuture = CompletableFuture.anyOf(future1, future2, future3);Object result = anyOfFuture.get();System.out.println(result); 

5、串行执行多个任务

通过 CompletableFuture 的方法 thenApply()、thenAccept() 和 thenRun() 可以串行执行多个任务,每个任务在前一个任务完成后才会执行。

CompletableFuture future1 = CompletableFuture.supplyAsync(() -> "Hello");CompletableFuture future2 = future1.thenApply(result -> result + " CompletableFuture");CompletableFuture future3 = future2.thenAccept(result -> System

6、 检查异步任务是否执行完成和执行回调

CompletableFuture中,可以使用isDone()方法来检查异步任务是否已经执行完毕。该方法会返回一个boolean类型的值,表示异步任务是否已经完成。如果异步任务已经完成,则可以通过调用get()方法获取其返回值;如果异步任务还没有完成,则可以通过注册回调函数来等待其完成。

CompletableFuture future = CompletableFuture.supplyAsync(() -> {    // 异步任务    return "Hello, World!";});// 检查异步任务是否已经完成if (future.isDone()) {    // 获取异步任务的返回值    String result = future.get();    System.out.println(result);} else {    // 注册回调函数,在异步任务完成时获取其返回值    future.thenAccept(result -> {        System.out.println(result);    });}

五、使用场景

在调用第三方同步API时,我们通常需要等待API返回结果后才能继续执行后续代码,这可能会导致系统的吞吐量较低,影响用户的体验。使用CompletableFuture可以在异步执行API请求的同时,继续执行后续代码,从而提高系统的吞吐量。
下面是一个使用CompletableFuture提高系统吞吐量的示例代码。

public class APIService {    public String getDataFromAPI(String url) {        // 同步请求API        String result = request(url);        return result;    }    public CompletableFuture getDataFromAPIAsync(String url) {        // 异步请求API        CompletableFuture future = CompletableFuture.supplyAsync(() -> request(url));        return future;    }    private String request(String url) {        // 请求API并返回结果        try {            // 打印线程和请求参数,观察结果帮助理解            System.out.println(Thread.currentThread().getName());            System.out.println(url);            // 睡眠模拟请求耗时            TimeUnit.SECONDS.sleep(2);        } catch (InterruptedException e) {            throw new RuntimeException(e);        }        return "success";    }}

在上面的代码中,getDataFromAPI方法是同步请求API的方法,会阻塞后续代码的执行。而getDataFromAPIAsync方法则是使用CompletableFuture异步请求API的方法,不会阻塞后续代码的执行,而是返回一个CompletableFuture对象,代表API请求的异步任务。

我们可以在后续代码中继续执行其他任务,等到异步任务完成后再获取结果。

public class Main {        public static void main(String[] args) {        APIService service = new APIService();                CompletableFuture future1 = service.getDataFromAPIAsync("https://api.example.com/data1");        CompletableFuture future2 = service.getDataFromAPIAsync("Https://api.example.com/data2");                // 继续执行其他任务        System.out.println("执行其他任务...");                // 等待异步任务完成并获取结果        String result1 = future1.join();        String result2 = future2.join();                // 处理结果        System.out.println("处理结果...");    }}

在上面的代码中,我们使用了CompletableFuture异步请求两个API,并在后续代码中继续执行其他任务。当异步任务完成后,我们使用join方法获取结果,并处理结果。

除了使用join方法获取结果外,使用get方法也可以获取结果。我们还可以使用thenApplythenAcceptthenCompose等方法对异步任务的结果进行处理。另外,当我们需要等待多个异步任务的完成并获取结果时,可以使用前面介绍的allOfanyOf方法。

来源地址:https://blog.csdn.net/qq_41378597/article/details/129655343

--结束END--

本文标题: CompletableFuture的使用

本文链接: https://lsjlt.com/news/388761.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • CompletableFuture的使用
    目录 一、前言 二、概念介绍  三、自身特性 四、使用方式 1、异步执行一个任务并获取结果 2、异步执行一个任务并处理异常 3、异步执行多个任务并合并结果 4、异步执行多个任务并处理其中一个任务的结果 5、串行执行多个任务 6、 检查异步任...
    99+
    2023-09-01
    java
  • 怎么使用CompletableFuture
    这篇文章主要讲解了“怎么使用CompletableFuture”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用CompletableFuture”吧!但Future机制,还不那么灵活,...
    99+
    2023-06-15
  • CompletableFuture使用详解
    一、简介 1.1 概述 在上一篇文章《CompletionService使用与源码分析》中,已经介绍过了Future的局限性,它没法直接对多个任务进行链式、组合等处理,需要借助并发工具类才能完成,实现逻辑比较复杂。 而Completable...
    99+
    2023-08-16
    java Future
  • CompletableFuture怎么使用
    这篇文章主要讲解了“CompletableFuture怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CompletableFuture怎么使用”吧!一个美好的期望通常情况下,我们希望...
    99+
    2023-07-06
  • Java CompletableFuture的使用详解
    目录CompletableFuture​任务开启任务结束串行任务thenApply\thenApplyAsync 串行将异步结果进行同步\异步的处理handle\hand...
    99+
    2024-04-02
  • 详解Java8中CompletableFuture类的使用
    目录创建CompletableFuture处理CompletableFuture的结果处理CompletableFuture的异常总结Java 8中引入了CompletableFut...
    99+
    2023-05-15
    Java8 CompletableFuture类使用 Java8 CompletableFuture类 Java8 CompletableFuture
  • Java8中的CompletableFuture类怎么使用
    本篇内容主要讲解“Java8中的CompletableFuture类怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java8中的CompletableFuture类怎么使用”吧!Java...
    99+
    2023-07-06
  • Java8中CompletableFuture怎么使用
    今天小编给大家分享一下Java8中CompletableFuture怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1...
    99+
    2023-06-29
  • Java 8中CompletableFuture如何使用
    Java 8中CompletableFuture如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、创建一个完成的CompletableFuture最简单的例子就是使用一...
    99+
    2023-06-15
  • Java8 使用CompletableFuture 构建异步应用方式
    目录概述同步API VS 异步API同步API异步API同步的困扰实现异步API将同步方法改为异步方法处理异常错误概述 为了展示 CompletableFuture 的强大特性, 创...
    99+
    2024-04-02
  • Java8中CompletableFuture的用法全解
    目录前言一、创建异步任务1、Future.submit2、supplyAsync / runAsync二、异步回调1、thenApply / thenApplyA...
    99+
    2024-04-02
  • Java8并发新特性CompletableFuture怎么使用
    这篇文章主要介绍“Java8并发新特性CompletableFuture怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java8并发新特性CompletableFuture怎么使用”文章能帮...
    99+
    2023-06-30
  • Java中CompletableFuture的作用是什么
    这篇文章给大家介绍Java中CompletableFuture的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。创建CompletableFuture对象。以下四个静态方法用来为一段异步执行的代码创建Compl...
    99+
    2023-06-17
  • Java8中CompletableFuture使用场景与实现原理
    目录1.概述2.为什么引入CompletableFuture3.功能3.源码追踪4.总结1.概述 CompletableFuture是jdk1.8引入的实现类。扩展了Future和C...
    99+
    2024-04-02
  • 详解Java CompletableFuture使用方法以及与FutureTask的区别
    目录futureTask 创建异步任务创建任务1. .supplyAsync2. .runAsync异步回调1. .thenApply2. .thenAccept3. .except...
    99+
    2024-04-02
  • Java8如何使用CompletableFuture构建异步应用方式
    小编给大家分享一下Java8如何使用CompletableFuture构建异步应用方式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!概述为了展示 Completa...
    99+
    2023-06-25
  • 分析Java8使用工厂方法supplyAsync创建CompletableFuture
    这篇文章主要介绍“分析Java8使用工厂方法supplyAsync创建CompletableFuture”,在日常操作中,相信很多人在分析Java8使用工厂方法supplyAsync创建CompletableFuture问题上存在疑惑,小编...
    99+
    2023-06-25
  • CompletableFuture使用详解(全网看这一篇就行)
    CompletableFuture是jdk8的新特性。CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步会点、流式处理、多个Future组合处理的能力,使Java...
    99+
    2023-09-12
    java
  • Java8 使用工厂方法supplyAsync创建CompletableFuture实例
    目录使用工厂方法 supplyAsync创建 CompletableFuture对比对CompletableFuture async的理解目前为止我们已经了解了如何通过编程创建 Co...
    99+
    2024-04-02
  • 详解Java8 CompletableFuture的并行处理用法
    目录前言场景用法1、在线API2、编写在线API查询3、编写查询服务4、编写测试接口5、效果6、CompletableFuture并行查询7、编写测试接口8、CompletableF...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作