当前位置: 首页 > java >正文

CompletableFuture

CompletableFuture 是 Java 8 引入的一个类,它实现了 Future 和 CompletionStage 接口,用于异步编程。 它可以让你以非阻塞的方式执行任务,并在任务完成时获取结果或处理异常。

CompletableFuture 的主要特点:

  1. 异步执行CompletableFuture 允许你将任务提交给线程池或其他执行器异步执行,而无需阻塞当前线程。
  2. 链式调用CompletableFuture 提供了丰富的链式调用方法,可以让你将多个异步操作组合在一起,形成一个完整的异步流程。
  3. 异常处理CompletableFuture 提供了灵活的异常处理机制,可以让你捕获和处理异步操作中可能发生的异常。
  4. 组合多个 CompletableFutureCompletableFuture 提供了多种方法来组合多个 CompletableFuture,例如 thenCombinethenComposeallOf 等。
  5. 手动完成CompletableFuture 允许你手动设置任务的结果或抛出异常,这在某些特殊场景下非常有用。

CompletableFuture 的常用方法:

  • 创建 CompletableFuture:
    • CompletableFuture.runAsync(Runnable runnable): 异步执行一个 Runnable 任务,没有返回值。
    • CompletableFuture.supplyAsync(Supplier<T> supplier): 异步执行一个 Supplier 任务,返回一个 CompletableFuture<T> 对象。
    • CompletableFuture.completedFuture(T value): 创建一个已经完成的 CompletableFuture,并设置结果值为 value
  • 处理结果:
    • thenApply(Function<T, U> fn): 当 CompletableFuture 完成时,将结果传递给 fn 函数进行处理,并返回一个新的 CompletableFuture<U> 对象。
    • thenAccept(Consumer<T> consumer): 当 CompletableFuture 完成时,将结果传递给 consumer 函数进行处理,没有返回值。
    • thenRun(Runnable action): 当 CompletableFuture 完成时,执行 action 任务,没有返回值。
  • 处理异常:
    • exceptionally(Function<Throwable, T> fn): 当 CompletableFuture 发生异常时,将异常对象传递给 fn 函数进行处理,并返回一个新的 CompletableFuture<T> 对象。
    • handle(BiFunction<T, Throwable, U> fn): 当 CompletableFuture 完成时,将结果或异常对象传递给 fn 函数进行处理,并返回一个新的 CompletableFuture<U> 对象。
    • whenComplete(BiConsumer<T, Throwable> action): 当 CompletableFuture 完成时,将结果或异常对象传递给 action 函数进行处理,没有返回值。
  • 组合 CompletableFuture:
    • thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): 当两个 CompletableFuture 都完成时,将它们的结果传递给 fn 函数进行处理,并返回一个新的 CompletableFuture<V> 对象。
    • thenCompose(Function<T, CompletionStage<U>> fn): 当 CompletableFuture 完成时,将结果传递给 fn 函数进行处理,fn 函数返回一个新的 CompletableFuture<U> 对象,并将该 CompletableFuture<U> 对象作为结果返回。
    • allOf(CompletableFuture<?>... cfs): 当所有 CompletableFuture 都完成时,返回一个新的 CompletableFuture<Void> 对象。
    • anyOf(CompletableFuture<?>... cfs): 当任何一个 CompletableFuture 完成时,返回一个新的 CompletableFuture<Object> 对象。
  • 获取结果:
    • get(): 阻塞当前线程,直到 CompletableFuture 完成,并返回结果。 如果发生异常,则抛出 ExecutionException
    • get(long timeout, TimeUnit unit): 阻塞当前线程,直到 CompletableFuture 完成,或超过指定的超时时间,并返回结果。 如果发生异常,则抛出 ExecutionException。 如果超时,则抛出 TimeoutException
    • join(): 阻塞当前线程,直到 CompletableFuture 完成,并返回结果。 如果发生异常,则抛出 CompletionException 或 RuntimeException
    • getNow(T valueIfAbsent): 如果 CompletableFuture 已经完成,则返回结果。 否则,返回 valueIfAbsent
    • isDone(): 判断 CompletableFuture 是否已经完成。

CompletableFuture 的使用示例:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;public class CompletableFutureExample {public static void main(String[] args) throws ExecutionException, InterruptedException {// 异步执行一个 Supplier 任务CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {System.out.println("Executing task in a separate thread...");try {Thread.sleep(2000); // 模拟耗时操作} catch (InterruptedException e) {Thread.currentThread().interrupt();}return "Hello, CompletableFuture!";});// 处理结果future.thenAccept(result -> {System.out.println("Result: " + result);});// 处理异常future.exceptionally(ex -> {System.err.println("Exception: " + ex.getMessage());return null;});// 阻塞当前线程,直到 CompletableFuture 完成String result = future.get();System.out.println("Final Result: " + result);}
}

展开

在这个例子中,我们使用 CompletableFuture.supplyAsync() 方法异步执行一个 Supplier 任务,该任务返回一个字符串。 然后,我们使用 thenAccept() 方法处理结果,并使用 exceptionally() 方法处理异常。 最后,我们使用 get() 方法阻塞当前线程,直到 CompletableFuture 完成,并获取结果。

http://www.xdnf.cn/news/3433.html

相关文章:

  • 【基础算法】二分查找算法 - JAVA
  • Python Cookbook-6.12 检查一个实例的状态变化
  • 【笔记】深度学习模型训练的 GPU 内存优化之旅③:内存交换篇
  • 【软件设计师:复习】上午题核心知识点总结(二)
  • C语言学习之动态内存的管理
  • VSCode插件Python Image Preview使用笔记
  • 【FreeRTOS-列表和列表项】
  • PyTorch中“原地”赋值的思考
  • QT —— 信号和槽(带参数的信号和槽函数)
  • Qwen3 正式发布
  • Ethan独立开发产品日报 | 2025-04-30
  • Java中修饰类的关键字
  • [蓝桥杯 2021 省 AB] 砝码称重 Java
  • 【论文速递】2025年08周 (Robotics/Embodied AI/LLM)
  • Y1代码AC集
  • 坚鹏:平安保险集团《保险行业发展趋势与AI应用方法及案例》培训
  • 【Redis】Another Redis Desktop Manager 安装指南
  • 深入理解虚拟机与容器:原理、对比与应用场景分析
  • 动态规划简单题2
  • 算法-堆、排序算法、矩阵乘法
  • 面试手撕——迭代法中序遍历二叉树
  • 负载均衡深度实践:基于Nginx+Keepalived的高可用方案与Zabbix监控设计
  • Cesium Entity动态更新
  • 嵌入式AI还是一片蓝海
  • Day107 | 147.对链表进行插入排序 | 简单选择、冒泡、直接插入
  • 【专题五】位运算(2)
  • AXI中的out of order和interleaving的定义和两者的差别?
  • OSPF的路由
  • Go-web开发之社区功能
  • Java 中那些奇怪的空指针报错场景及解决方案NullPointerException