首页 > 编程语言 >使用 CompletableFuture 实现异步编程

使用 CompletableFuture 实现异步编程

时间:2025-01-12 23:00:18浏览次数:1  
标签:异步 编程 System CompletableFuture result println out

使用 CompletableFuture 实现异步编程

在现代 Java 开发中,异步编程是一项重要技能。而 CompletableFuture 是从 Java 8 开始提供的一个功能强大的工具,用于简化异步任务的编写和组合。本文将详细介绍 CompletableFuture 的基本使用和一些常见的应用场景。

1. 为什么选择 CompletableFuture?

传统的异步编程通常依赖于回调或 Future,但这些方法存在一些缺陷:

  • 回调地狱:嵌套层级多,代码难以阅读。
  • Future 的 get() 方法是阻塞的,无法真正实现非阻塞式编程。

CompletableFuture 的优势在于:

  1. 支持非阻塞操作。
  2. 提供丰富的 API 用于任务的组合和处理。
  3. 更好的错误处理机制。

2. 基本用法

创建一个 CompletableFuture

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {
    public static void main(String[] args) {
        // 创建一个异步任务
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(1000); // 模拟耗时操作
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return "Hello, CompletableFuture!";
        });

        // 非阻塞地获取结果
        future.thenAccept(result -> System.out.println("Result: " + result));

        System.out.println("Main thread is not blocked");

        // 防止主线程退出过早
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

输出

Main thread is not blocked
Result: Hello, CompletableFuture!

3. 任务组合

thenApply: 转换结果

thenApply 方法用于将异步任务的结果转换为另一种类型。

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> "42")
    .thenApply(Integer::parseInt)
    .thenApply(num -> num * 2);

future.thenAccept(result -> System.out.println("Final Result: " + result));

thenCompose: 链式调用

thenCompose 用于在一个任务完成后启动另一个异步任务。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello")
    .thenCompose(s -> CompletableFuture.supplyAsync(() -> s + " World!"));

future.thenAccept(System.out::println);

thenCombine: 合并两个任务

thenCombine 用于合并两个独立的异步任务的结果。

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");

CompletableFuture<String> result = future1.thenCombine(future2, (s1, s2) -> s1 + " " + s2);
result.thenAccept(System.out::println);

4. 异常处理

在异步任务中,异常处理非常重要。CompletableFuture 提供了多种方法来优雅地处理异常。

exceptionally: 捕获异常并返回默认值

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    if (true) {
        throw new RuntimeException("Something went wrong");
    }
    return "Success";
}).exceptionally(ex -> {
    System.out.println("Exception: " + ex.getMessage());
    return "Default Value";
});

future.thenAccept(System.out::println);

handle: 处理结果和异常

handle 方法无论任务成功还是失败都会执行,并可以访问异常信息。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    if (true) {
        throw new RuntimeException("Error occurred");
    }
    return "Success";
}).handle((result, ex) -> {
    if (ex != null) {
        System.out.println("Exception: " + ex.getMessage());
        return "Recovered from error";
    }
    return result;
});

future.thenAccept(System.out::println);

5. 实际应用场景

并发请求处理

在需要同时处理多个请求时,可以利用 allOfanyOf 方法。

allOf: 等待所有任务完成

CompletableFuture<Void> allTasks = CompletableFuture.allOf(
    CompletableFuture.runAsync(() -> System.out.println("Task 1")),
    CompletableFuture.runAsync(() -> System.out.println("Task 2")),
    CompletableFuture.runAsync(() -> System.out.println("Task 3"))
);

allTasks.thenRun(() -> System.out.println("All tasks completed"));

anyOf: 任意任务完成即返回

CompletableFuture<Object> anyTask = CompletableFuture.anyOf(
    CompletableFuture.supplyAsync(() -> "Task 1 completed"),
    CompletableFuture.supplyAsync(() -> "Task 2 completed")
);

anyTask.thenAccept(result -> System.out.println("First completed: " + result));

6. 总结

CompletableFuture 是 Java 异步编程的强大工具,提供了丰富的 API 来实现任务的创建、组合和异常处理。通过熟练掌握 CompletableFuture,可以编写更加简洁高效的异步代码。

希望本文能帮助你更好地理解和使用 CompletableFuture

欢迎关注gzh:加瓦点灯
每天推送干货知识

本文由mdnice多平台发布

标签:异步,编程,System,CompletableFuture,result,println,out
From: https://www.cnblogs.com/javadd/p/18667571

相关文章

  • 从入门到精通:Java 基础语法全解析,快速掌握核心编程技能
    系列文章目录01-从入门到精通:Java基础语法全解析,快速掌握核心编程技能文章目录系列文章目录前言一、Java的基本语法规则1.1Java程序结构1.1.1代码解析1.1.2Java的基本语法规则1.2Java的代码风格和规范二、变量与数据类型2.1变量的定义与使用2.1.1变量的声......
  • 2025 年 1 月 TIOBE 指数,一月头条:Python 是 TIOBE 2024 年度编程语言!
    2025年1月TIOBE指数一月头条:Python是TIOBE2024年度编程语言!编程语言Python赢得了“TIOBE2024年度编程语言”称号。该奖项授予一年内评级增幅最高的编程语言。Python在2024年增长了9.3%。这远远领先于其竞争对手:Java+2.3%、JavaScript+1.4%和Go+1.2%。......
  • 读书记录--GO语言高级编程
    20240220问题记录如果某个包被多次导入的话,在执行的时候只会导入一次。当一个包被导入时,如果它还导入了其它的包,则先将其它的包包含进来,然后创建和初始化这个包的常量和变量,再调用包里的init函数,如果一个包有多个init函数的话,调用顺序未定义(实现可能是以文件名的顺序调用),同......
  • .NET 响应式编程 System.Reactive 系列文章(一):基础概念
    .NET响应式编程System.Reactive系列文章(一):基础概念引言在现代软件开发中,处理异步事件和数据流已经成为常见的需求,比如用户输入、网络请求、传感器数据等。这些数据流通常是无限的、异步的、实时的,而传统的编程方式往往无法优雅地处理这些情况。响应式编程(ReactivePro......
  • IML 编程简介
    什么是交互式矩阵语言(IML)?IML是一种类似于MATLAB和Gauss的矩阵语言。它使SAS能够使用许多内置矩阵函数更有效地进行矩阵计算。它只能处理二维矩阵。IML编码有四种主要用途:它有助于对难以在SAS上编码的统计程序进行编程。此类程序本质上是迭代的,因此仅使用宏进行......
  • Qt异步实现事件的定时执行 - QTimer和QThread的联合使用
    引言在Qt开发中,异步定时执行事件是常见需求。为了提高应用程序的响应能力和性能,合理使用QTimer和QThread可以实现高效的异步定时任务。本文将详细介绍如何在Qt中通过QTimer和QThread的联合使用,实现异步事件的定时执行。QTimer简介QTimer是Qt中用于定时操作的类。它可以在指定的......
  • 网络编程调试与故障排查
    网络编程调试与故障排查补天云火鸟博客创作软件补天云网站1QT网络编程基础1.1QT网络库简介与安装1.1.1QT网络库简介与安装QT网络库简介与安装章节标题,QT网络库简介与安装在现代软件开发领域,尤其是跨平台应用开发中,网络通信是不可或缺的一部分。Qt作为一种多平台......
  • AI 自动化编程:现状剖析与局限洞察
    前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦......
  • 面向正确的结果编程和容错型编程的思考
    我们常常会写一种“理想主义”的代码,怎么说呢?就是假设世界一片美好,用户永远乖巧听话。比如你写了个程序,只要用户输入1+1,它就优雅地回答:2。完美!但问题是,现实哪有这么简单?用户是天马行空的生物。他们可能输入1+1(多了空格),甚至直接来个1+3,完全无视你的规则。这时候,程序很可能会懵住......
  • 自动化编程的边界、程序员的转型与教育的革新
    引言:人工智能(AI)正以前所未有的速度渗透到IT行业的各个领域,其中自动化编程作为一项关键技术,备受关注。本文将深入探讨AI自动化编程的现状与局限、AI辅助提升工作效率的模式与实践、以及AI自动化编程对未来编程教育的影响,旨在为IT从业者和教育者提供更全面的视角和参考。方向一......