面试题答案
一键面试代码简洁性优势
- 传统方式:在传统Java多线程处理异步操作结果时,通常需要手动管理线程、等待结果并处理回调。例如,使用
Future
接口时,可能需要如下代码:
import java.util.concurrent.*;
public class TraditionalFutureExample {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executorService = Executors.newFixedThreadPool(1);
Future<Integer> future = executorService.submit(() -> {
// 模拟异步操作
Thread.sleep(2000);
return 42;
});
while (!future.isDone()) {
// 等待异步操作完成
Thread.sleep(100);
}
Integer result = future.get();
System.out.println("传统方式结果: " + result);
executorService.shutdown();
}
}
这段代码中,需要手动创建线程池、提交任务、轮询任务状态以及获取结果,代码相对繁琐。
2. thenAccept
方式:CompletableFuture
的thenAccept
方法使用链式调用的方式处理异步操作结果,代码更加简洁。如下:
import java.util.concurrent.CompletableFuture;
public class CompletableFutureThenAcceptExample {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> {
// 模拟异步操作
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 42;
}).thenAccept(result -> System.out.println("thenAccept方式结果: " + result));
}
}
这里通过supplyAsync
创建异步任务,然后直接通过thenAccept
处理结果,无需手动管理线程状态和轮询,代码更加紧凑。
可读性优势
- 传统方式:传统方式代码结构上,线程管理、任务提交和结果获取分散在不同的代码块中,逻辑不够连贯。例如上述传统方式代码,等待结果的
while
循环和获取结果的future.get()
与任务提交部分代码分离,阅读起来需要在不同代码段间切换理解逻辑。 thenAccept
方式:thenAccept
采用链式调用,异步任务的创建和结果处理在同一链式调用中,逻辑流程一目了然。从supplyAsync
开始发起异步任务,紧接着thenAccept
处理结果,代码的执行顺序和逻辑关系更加清晰,提高了可读性。
综上,CompletableFuture
的thenAccept
方法在处理异步操作结果时,在代码简洁性和可读性方面相较于传统方式具有显著优势。