首页 > 图灵资讯 > java面试题>正文
为什么用
如何使用
如何在Java中使用CompletableFuture进行异步编程?
2025-02-18 13:13:31
什么是异步编程?
先说说背景,什么是异步编程?简单来说,就是让程序在执行某些耗时任务时不用傻等着结果出来,而是可以先去忙别的事情。比如,你点了外卖(发起任务),不用一直盯着骑手的位置(等待结果),而是可以先去打游戏、看电影,等外卖到了再通知你。
在Java中,CompletableFuture
就是一个工具,帮你实现这种异步操作。
为什么用CompletableFuture
?
传统上,我们可以用线程(Thread)或线程池(ExecutorService)来实现并发操作,但代码会变得复杂,尤其是当任务之间有依赖关系时,管理起来非常麻烦。而CompletableFuture
可以让这些事情变得简单直观。
CompletableFuture
能做什么?
- 异步执行任务:比如你想在后台做个耗时操作,不影响主线程的运行。
- 任务完成后做点别的事:比如外卖送到后,自动提醒你。
- 多个任务组合:比如你点了外卖,还订了饮料,等两样都送到后再开饭。
- 处理异常:比如骑手迷路了,可以处理这种意外情况。
如何使用CompletableFuture
?
1. 简单的异步任务
想象一下,你在后台下载一个文件,不想让主线程等着:
- 用
CompletableFuture
可以让任务在另一个线程中执行。 - 主线程可以继续做别的事,等任务完成后再通知你。
2. 任务完成后继续处理
假设你下载完文件后,还要解压文件:
CompletableFuture
可以在下载完成后,自动执行解压操作。- 你不用手动检查下载是否完成,它会帮你处理这种“先做这个,再做那个”的逻辑。
3. 多个任务的组合
比如:
- 你点了外卖和饮料,外卖和饮料可以同时送,互不干扰。
- 但你得等两样都送到了,才能吃饭。
CompletableFuture
可以帮你组合这些任务,等所有任务完成后再执行下一步。
4. 处理异常
比如:
- 骑手迷路了,或者商家取消了订单。
CompletableFuture
可以帮你捕获这些异常,并做出相应处理,比如重新下单。
CompletableFuture
的常见方法
虽然我不会展示代码,但要理解它的一些核心方法,能帮助你更好地使用它:
-
supplyAsync
:- 用于启动一个有返回值的异步任务。
- 比如:下载一个文件,任务完成后会返回文件路径。
-
thenApply
:- 用于在某个任务完成后,对结果进行处理。
- 比如:文件下载完成后,自动解压这个文件。
-
thenCombine
:- 用于把两个任务的结果合并起来。
- 比如:外卖和饮料都送到了,组合成一个“可以开饭”的信号。
-
exceptionally
:- 用于处理任务中的异常。
- 比如:外卖没送到,通知你订单取消了。
-
allOf
和anyOf
:allOf
:等所有任务完成后再继续。anyOf
:只要有一个任务完成,就可以继续。
举个生活化的例子
假设你今天中午想吃披萨,还想喝奶茶。你点了两单:
- 点披萨(任务1)。
- 点奶茶(任务2)。
这两个任务是独立的,可以同时进行。用CompletableFuture
实现时:
- 你可以用
supplyAsync
来分别启动两个任务。 - 用
thenCombine
来等两件事都完成后,通知你“可以开饭了”。 - 如果其中一个任务失败了,比如奶茶店关门了,你可以用
exceptionally
来处理这个问题,比如改喝可乐。
总结
CompletableFuture
是一个强大的工具,能让你轻松实现异步操作。它的核心思想就是:
- 把任务交给后台线程去执行。
- 不用你手动检查任务完成情况,它会自动通知你。
- 能灵活组合多个任务。
- 还能优雅地处理异常。
