Java中的CompletableFuture详解

简介: `CompletableFuture`提供了一种简洁而强大的方式来处理Java中的异步编程。通过它,我们可以轻松地创建和组合异步任务,并处理任务中的异常。掌握 `CompletableFuture`的使用,将显著提升Java并发编程的效率和代码可读性。

Java中的CompletableFuture详解

CompletableFuture是Java 8引入的一个强大的工具,用于处理异步编程。它实现了 Future接口,并增加了很多功能,使得处理异步任务更加方便和灵活。本文将详细介绍 CompletableFuture的使用,包括其基本概念、创建和组合异步任务、处理结果及异常、以及一些高级用法。

1. 基本概念

CompletableFuture是一个可以手动完成的 Future。它不仅可以用来表示一个异步计算的结果,还可以将多个异步任务串联起来,形成复杂的异步流程。

2. 创建CompletableFuture

2.1 创建一个已完成的CompletableFuture

CompletableFuture<String> completedFuture = CompletableFuture.completedFuture("Hello");
​

2.2 异步运行任务

使用 runAsyncsupplyAsync方法可以异步地运行任务:

CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
    // 异步任务
    System.out.println("Task is running asynchronously");
});

CompletableFuture<String> futureWithResult = CompletableFuture.supplyAsync(() -> {
    // 异步任务并返回结果
    return "Result of the asynchronous computation";
});
​

3. 组合多个CompletableFuture

3.1 thenApply

使用 thenApply方法处理异步计算的结果,并返回一个新的 CompletableFuture

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello")
    .thenApply(result -> result + " World");
​

3.2 thenAccept

使用 thenAccept方法处理计算的结果,但不返回新的 CompletableFuture

CompletableFuture.supplyAsync(() -> "Hello")
    .thenAccept(result -> System.out.println(result + " World"));
​

3.3 thenCombine

使用 thenCombine方法组合两个独立的 CompletableFuture,并返回一个新的 CompletableFuture

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

CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + " " + result2);
combinedFuture.thenAccept(System.out::println);
​

4. 异常处理

CompletableFuture提供了多种方法来处理异步任务中的异常。

4.1 exceptionally

使用 exceptionally方法在计算出现异常时提供默认值:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    if (true) throw new RuntimeException("Exception occurred");
    return "Result";
}).exceptionally(ex -> "Default Result");
​

4.2 handle

使用 handle方法处理正常和异常的结果:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    if (true) throw new RuntimeException("Exception occurred");
    return "Result";
}).handle((result, ex) -> {
    if (ex != null) {
        return "Default Result";
    } else {
        return result;
    }
});
​

5. 组合异步任务

5.1 allOf

使用 allOf方法等待所有给定的 CompletableFuture完成:

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

CompletableFuture<Void> allOf = CompletableFuture.allOf(future1, future2);
allOf.thenRun(() -> {
    try {
        System.out.println(future1.get() + " " + future2.get());
    } catch (Exception e) {
        e.printStackTrace();
    }
});
​

5.2 anyOf

使用 anyOf方法只要任意一个 CompletableFuture完成:

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

CompletableFuture<Object> anyOf = CompletableFuture.anyOf(future1, future2);
anyOf.thenAccept(result -> System.out.println(result));
​

思维导图

- CompletableFuture详解
  - 基本概念
  - 创建CompletableFuture
    - completedFuture
    - runAsync和supplyAsync
  - 组合多个CompletableFuture
    - thenApply
    - thenAccept
    - thenCombine
  - 异常处理
    - exceptionally
    - handle
  - 组合异步任务
    - allOf
    - anyOf
​

总结

CompletableFuture提供了一种简洁而强大的方式来处理Java中的异步编程。通过它,我们可以轻松地创建和组合异步任务,并处理任务中的异常。掌握 CompletableFuture的使用,将显著提升Java并发编程的效率和代码可读性。

目录
相关文章
|
9月前
|
Java API 网络架构
Java 线程中CompletableFuture的例子
Java 线程中CompletableFuture的例子
77 0
|
4月前
|
Java 流计算
利用java8 的 CompletableFuture 优化 Flink 程序
本文探讨了Flink使用avatorscript脚本语言时遇到的性能瓶颈,并通过CompletableFuture优化代码,显著提升了Flink的QPS。文中详细介绍了avatorscript的使用方法,包括自定义函数、从Map中取值、使用Java工具类及AviatorScript函数等,帮助读者更好地理解和应用avatorscript。
利用java8 的 CompletableFuture 优化 Flink 程序
|
7月前
|
Java API 数据库
深研Java异步编程:CompletableFuture与反应式编程范式的融合实践
【7月更文挑战第1天】Java 8的CompletableFuture革新了异步编程,提供链式处理和优雅的错误处理。反应式编程,如Project Reactor,强调数据流和变化传播,擅长处理大规模并发和延迟敏感任务。两者结合,如通过Mono转换CompletableFuture,兼顾灵活性与资源管理,提升现代Java应用的并发性能和响应性。开发者可按需选择和融合这两种技术,以适应高并发环境。
67 1
|
8月前
|
Java API 数据库
深研Java异步编程:CompletableFuture与反应式编程范式的融合实践
【6月更文挑战第30天】Java 8的CompletableFuture革新了异步编程,提供如thenApply等流畅接口,而Java 9后的反应式编程(如Reactor)强调数据流和变化传播,以事件驱动应对高并发。两者并非竞争关系,而是互补,通过Flow API和第三方库结合,如将CompletableFuture转换为Mono进行反应式处理,实现更高效、响应式的系统设计。开发者可根据需求灵活选用,提升现代Java应用的并发性能。
118 1
|
3月前
|
SQL Rust Java
Java 8 异步编程利器:CompletableFuture
Java 8引入了CompletableFuture,这是一个强大的异步编程工具,增强了Future的功能,支持链式调用、任务组合与异常处理等特性,使异步编程更加直观和高效。本文详细介绍了CompletableFuture的基本概念、用法及高级功能,帮助开发者更好地掌握这一工具。
|
3月前
|
JavaScript Java 中间件
Java CompletableFuture 异步超时实现探索
本文探讨了在JDK 8中`CompletableFuture`缺乏超时中断任务能力的问题,提出了一种异步超时实现方案,通过自定义工具类模拟JDK 9中`orTimeout`方法的功能,解决了任务超时无法精确控制的问题,适用于多线程并行执行优化场景。
|
8月前
|
设计模式 Java API
实战分析Java的异步编程,并通过CompletableFuture进行高效调优
【6月更文挑战第7天】实战分析Java的异步编程,并通过CompletableFuture进行高效调优
114 2
|
7月前
|
并行计算 算法 Java
Java面试题:解释Java中的无锁编程的概念,Java中的Fork/Join框架的作用和使用场景,Java中的CompletableFuture的作用和使用场景
Java面试题:解释Java中的无锁编程的概念,Java中的Fork/Join框架的作用和使用场景,Java中的CompletableFuture的作用和使用场景
52 0
|
7月前
|
安全 Java 数据库连接
Java面试题:解释Java内存模型的无锁编程支持,并讨论其优势和局限性,解释Java中的CompletableFuture的工作原理,并讨论其在异步编程中的应用
Java面试题:解释Java内存模型的无锁编程支持,并讨论其优势和局限性,解释Java中的CompletableFuture的工作原理,并讨论其在异步编程中的应用
41 0
|
8月前
|
存储 算法 Java
Java8 CompletableFuture:异步编程的瑞士军刀
Java8 CompletableFuture:异步编程的瑞士军刀
165 2

热门文章

最新文章