面试题答案
一键面试基本步骤
- 创建 CompletableFuture 对象:可以通过
CompletableFuture.supplyAsync(() -> { /* 异步执行的任务 */ })
方法创建,其中supplyAsync
适用于有返回值的异步任务。如果是无返回值的任务,可以使用CompletableFuture.runAsync(() -> { /* 异步执行的任务 */ })
。 - 处理异步结果:当异步任务完成后,可以使用
thenApply
、thenAccept
、thenRun
等方法来处理结果。thenApply
用于对异步任务返回的结果进行转换并返回新的结果;thenAccept
用于消费异步任务返回的结果,没有返回值;thenRun
用于在异步任务完成后执行一段无参数的代码块,也没有返回值。 - 处理异常:可以使用
exceptionally
方法来处理异步任务中抛出的异常。
示例代码
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 模拟从网络获取数据
return "network data";
});
future.thenApply(data -> {
// 处理获取到的数据
return "Processed: " + data;
})
.thenAccept(System.out::println)
.exceptionally(e -> {
e.printStackTrace();
return null;
});
// 主线程不能结束太快,这里简单睡眠一下
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在上述示例中:
CompletableFuture.supplyAsync(() -> "network data")
创建了一个异步任务,模拟从网络获取数据。thenApply
方法对获取到的数据进行处理并转换。thenAccept
方法将处理后的数据打印出来。exceptionally
方法捕获并处理异步任务中可能抛出的异常。- 主线程通过
Thread.sleep(1000)
防止主线程过早结束导致异步任务未执行完。