前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CompletableFuture的特点以及常规使用

CompletableFuture的特点以及常规使用

作者头像
名字是乱打的
发布2023-04-30 14:53:38
4500
发布2023-04-30 14:53:38
举报
文章被收录于专栏:软件工程

需求:系统接口比较慢,有的接口会通过许多数据库io或者网络io需一些数据,如果接口内这部分请求都是串行的会比较浪费时间,咱们这里可以做并行请求

一 CompletableFuture的介绍

CompletableFuture是Java 8引入的一个新特性,是一种用于异步编程的工具类。它可以用于处理异步任务,例如网络请求、文件读写、数据库查询等等,使得这些任务可以并发执行并在完成时得到通知。

CompletableFuture的原理主要是基于Java的Future模式和函数式编程思想。它封装了一个异步操作,并在操作完成后返回一个Future对象,可以通过该对象获取异步操作的结果。在异步操作完成之前,可以执行一些其他的操作,这些操作可以是同步的,也可以是异步的。

CompletableFuture具有以下特点:

  1. 可以链式调用:通过调用thenApply()thenAccept()thenRun()等方法,可以将多个异步操作链接在一起。
  2. 支持异常处理:可以使用exceptionally()handle()等方法处理异步操作抛出的异常。
  3. 支持合并操作:可以使用thenCombine()thenCompose()allOf()等方法合并多个异步操作的结果。
  4. 支持异步执行:可以使用CompletableFuture.supplyAsync()CompletableFuture.runAsync()等方法来执行异步操作。

在实现上,CompletableFuture使用了Java的线程池来实现异步执行,它可以在任务完成时通知等待该结果的线程。当CompletableFuture的结果被设置时,它会通知所有等待该结果的线程,使得它们可以继续执行。

总之,CompletableFuture提供了一种方便的异步编程方式,它通过利用Java的Future模式和函数式编程思想来实现。它可以帮助我们更加简单和高效地处理异步任务,提高代码的可读性和可维护性。

二 使用

当使用 CompletableFuture 时,我们通常需要执行以下步骤:

  1. 创建一个 CompletableFuture 对象。
  2. 执行一个异步操作,可以使用 CompletableFuture.supplyAsync()CompletableFuture.runAsync() 方法。
  3. 调用 thenApply()thenAccept()thenRun() 等方法,将操作链起来。
  4. 调用 join() 方法获取异步操作的结果。

下面是一些常见的 CompletableFuture 使用场景及示例代码:

  1. 异步执行任务并获取结果:
代码语言:javascript
复制
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 异步执行任务
    return "hello world";
});

String result = future.join();
System.out.println(result);
  1. 顺序执行多个异步任务:
代码语言:javascript
复制
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 异步执行任务1
    return "hello";
}).thenApplyAsync((String s) -> {
    // 异步执行任务2,依赖于任务1的结果
    return s + " world";
}).thenApplyAsync((String s) -> {
    // 异步执行任务3,依赖于任务2的结果
    return s.toUpperCase();
});

String result = future.join();
System.out.println(result);
  1. 并发执行多个异步任务并等待结果:
代码语言:javascript
复制
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
    // 异步执行任务1
    return "hello";
});

CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
    // 异步执行任务2
    return "world";
});

CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {
    // 异步执行任务3
    return "!";
});

CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3);
allFutures.join();

System.out.println(future1.join() + " " + future2.join() + future3.join());
  1. 处理异步任务抛出的异常:
代码语言:javascript
复制
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 异步执行任务
    throw new RuntimeException("error");
}).exceptionally((Throwable t) -> {
    // 处理异常
    return "default";
});

String result = future.join();
System.out.println(result);
  1. 串行执行多个异步任务:
代码语言:javascript
复制
CompletableFuture<String> future = CompletableFuture.completedFuture("hello")
        .thenComposeAsync((String s) -> {
            // 异步执行任务2,依赖于任务1的结果
            return CompletableFuture.completedFuture(s + " world");
        })
        .thenComposeAsync((String s) -> {
            // 异步执行任务3,依赖于任务2的结果
            return CompletableFuture.completedFuture(s.toUpperCase());
        });

String result = future.join();
System.out.println(result);

上述示例代码只是 CompletableFuture 的一些常规使用场景,实际上 CompletableFuture 可以支持更加复杂的场景,如链式调用、合并操作等。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 CompletableFuture的介绍
  • 二 使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档