Java 8 异步编程利器:CompletableFuture

简介: Java 8引入了CompletableFuture,这是一个强大的异步编程工具,增强了Future的功能,支持链式调用、任务组合与异常处理等特性,使异步编程更加直观和高效。本文详细介绍了CompletableFuture的基本概念、用法及高级功能,帮助开发者更好地掌握这一工具。

在Java 8中,推出了一个强大的异步编程工具:CompletableFuture。它提供了一套强大的API,使得异步编程更加容易和直观。本文将介绍CompletableFuture的基本概念和用法,以及一些高级功能。

基本概念

CompletableFuture是Java 8中新增的一个类,用来支持异步编程。它是对Future的增强,提供了更加强大的操作和组合方式。

CompletableFuture有以下几个重要的特性:

  • 支持链式调用,类似于流式编程。
  • 支持多个CompletableFuture之间的组合和协作。
  • 支持异常处理。

基本用法

CompletableFuture的基本用法非常简单。首先,我们可以创建一个CompletableFuture实例:

arduino

代码解读

复制代码

CompletableFuture<String> future = new CompletableFuture<>();

然后,我们可以使用supplyAsync方法来异步执行一个任务,并返回结果:

ini

代码解读

复制代码

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

接下来,我们可以使用thenAccept方法来处理结果:

arduino

代码解读

复制代码

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

这里使用了方法引用来输出结果,等价于以下代码:

sql

代码解读

复制代码

future.thenAccept(result -> System.out.println(result));

注意,thenAccept方法是一个消费者,它接收任务的结果作为参数,但没有返回值。

我们还可以使用thenApply方法来对任务的结果进行转换:

ini

代码解读

复制代码

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> "Hello, World!")
    .thenApply(String::length);

这里使用了方法引用来获取字符串的长度,等价于以下代码:

rust

代码解读

复制代码

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> "Hello, World!")
    .thenApply(str -> str.length());

注意,thenApply方法是一个函数式接口,接收任务的结果作为参数,并返回一个新的结果。

除了thenAccept和thenApply之外,还有很多其他的方法可以用来组合CompletableFuture。比如:

  • thenCombine:将两个CompletableFuture的结果合并为一个。
  • thenCompose:将当前CompletableFuture的结果作为下一个CompletableFuture的输入。
  • thenRun:在任务完成后执行一个Runnable。
  • exceptionally:处理任务抛出的异常。

所有这些方法都支持链式调用,使得代码更加简洁、易读。

高级功能

除了基本用法之外,CompletableFuture还提供了一些高级功能,用来处理更加复杂的异步编程场景。

多个CompletableFuture的组合

CompletableFuture支持多个CompletableFuture之间的组合和协作。比如,我们可以使用allOf方法来等待多个任务全部完成:

ini

代码解读

复制代码

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

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

allFutures.thenRun(() -> {
    System.out.println(future1.join() + " " + future2.join());
});

这里,我们使用allOf方法等待future1和future2两个任务全部完成,然后输出它们的结果。

类似地,我们也可以使用anyOf方法来等待多个任务中的任意一个完成。

超时处理

CompletableFuture还支持超时处理。比如,我们可以使用orTimeout方法来指定任务的超时时间:

arduino

代码解读

复制代码

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "Hello, World!";
}).orTimeout(1000, TimeUnit.MILLISECONDS).exceptionally(e -> "timeout!");

System.out.println(future.join());

这里,我们使用orTimeout方法指定了任务的超时时间为1秒。如果在1秒内任务未完成,就会抛出TimeoutException异常,然后执行异常处理器。

异常处理

CompletableFuture还支持异常处理。比如,我们可以使用exceptionally方法来处理任务抛出的异常:

ini

代码解读

复制代码

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 1 / 0)
    .thenApply(r -> r * 2)
    .exceptionally(e -> 0);

System.out.println(future.join());

这里,我们使用thenApply方法对任务的结果进行乘以2的操作。但是,由于任务会抛出ArithmeticException异常,所以我们使用exceptionally方法来处理异常,将结果设置为0。

除了exceptionally方法之外,还有很多其他的方法可以用来处理异常。比如:

  • handle:处理任务抛出的异常或正常返回的结果。
  • whenComplete:在任务完成后执行一个操作,并处理异常。

所有这些方法都非常灵活,可以根据具体的业务场景进行使用。

总结

CompletableFuture是Java 8中一个强大的异步编程工具,提供了一套强大的API,使得异步编程更加容易和直观。本文介绍了CompletableFuture的基本概念和用法,以及一些高级功能。通过学习本文,读者可以深入理解CompletableFuture的使用方法,掌握异步编程的技巧,为实际开发工作打下坚实的基础。


转载来源:https://juejin.cn/post/7217644586867523644

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