面试题答案
一键面试以下是使用Java的CompletableFuture
并发执行多个异步任务并合并结果的代码示例及关键步骤解释:
代码示例
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 模拟第一个异步任务,返回String类型结果
CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
// 模拟任务执行
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Task 1 result";
});
// 模拟第二个异步任务,返回Integer类型结果
CompletableFuture<Integer> task2 = CompletableFuture.supplyAsync(() -> {
// 模拟任务执行
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 42;
});
// 合并两个任务的结果
CompletableFuture<String> combinedFuture = task1.thenCombine(task2, (result1, result2) -> {
return result1 + " and " + result2;
});
// 获取最终合并的结果
String finalResult = combinedFuture.get();
System.out.println(finalResult);
}
}
关键步骤解释
-
创建异步任务:
- 使用
CompletableFuture.supplyAsync
方法创建异步任务。supplyAsync
接受一个Supplier
作为参数,在新的线程中执行Supplier
的get
方法,并返回一个CompletableFuture
对象。例如:
CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> { // 模拟任务执行 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return "Task 1 result"; });
这里创建了一个异步任务
task1
,返回String
类型的结果。同样的方式创建了task2
,返回Integer
类型的结果。 - 使用
-
合并任务结果:
- 使用
thenCombine
方法将两个CompletableFuture
的结果合并。thenCombine
接受另一个CompletableFuture
和一个BiFunction
作为参数。当两个CompletableFuture
都完成时,BiFunction
会被调用,它的两个参数分别是这两个CompletableFuture
的结果,返回值是合并后的结果。例如:
CompletableFuture<String> combinedFuture = task1.thenCombine(task2, (result1, result2) -> { return result1 + " and " + result2; });
这里将
task1
和task2
的结果合并成一个新的CompletableFuture
,类型为String
。 - 使用
-
获取最终结果:
- 使用
get
方法阻塞当前线程,直到CompletableFuture
完成并获取最终的合并结果。例如:
String finalResult = combinedFuture.get(); System.out.println(finalResult);
这里获取到合并后的结果并打印输出。
- 使用
通过以上步骤,可以使用CompletableFuture
并发执行多个异步任务,并将不同类型的结果合并成一个最终结果。