MST

星途 面试题库

面试题:Java 中如何使用 CompletableFuture 实现异步编程

请简述 Java 中 CompletableFuture 实现异步编程的基本步骤,并给出一个简单示例,该示例要求从网络获取数据并进行处理。
40.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

基本步骤

  1. 创建 CompletableFuture 对象:可以通过 CompletableFuture.supplyAsync(() -> { /* 异步执行的任务 */ }) 方法创建,其中 supplyAsync 适用于有返回值的异步任务。如果是无返回值的任务,可以使用 CompletableFuture.runAsync(() -> { /* 异步执行的任务 */ })
  2. 处理异步结果:当异步任务完成后,可以使用 thenApplythenAcceptthenRun 等方法来处理结果。thenApply 用于对异步任务返回的结果进行转换并返回新的结果;thenAccept 用于消费异步任务返回的结果,没有返回值;thenRun 用于在异步任务完成后执行一段无参数的代码块,也没有返回值。
  3. 处理异常:可以使用 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();
        }
    }
}

在上述示例中:

  1. CompletableFuture.supplyAsync(() -> "network data") 创建了一个异步任务,模拟从网络获取数据。
  2. thenApply 方法对获取到的数据进行处理并转换。
  3. thenAccept 方法将处理后的数据打印出来。
  4. exceptionally 方法捕获并处理异步任务中可能抛出的异常。
  5. 主线程通过 Thread.sleep(1000) 防止主线程过早结束导致异步任务未执行完。