面试题答案
一键面试以下是使用Java的CompletableFuture
的runAsync
方法创建异步任务,并处理异常的代码示例:
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExceptionHandling {
public static void main(String[] args) {
CompletableFuture.runAsync(() -> {
throw new RuntimeException("故意抛出的运行时异常");
})
.exceptionally(ex -> {
System.out.println("捕获到异常: " + ex.getMessage());
return null;
})
.thenRun(() -> System.out.println("任务结束"));
// 主线程等待一段时间,确保异步任务有足够时间执行
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
异常处理机制在异步场景下的工作原理
- 异步任务执行:
CompletableFuture.runAsync
方法会在一个新的线程(通常是ForkJoinPool.commonPool()
线程池中的线程)中执行给定的任务。在这个例子中,任务就是抛出一个运行时异常。 - 异常捕获:
exceptionally
方法用于捕获异步任务中抛出的异常。当异步任务抛出异常时,exceptionally
方法中的回调函数会被执行,传入的ex
参数就是抛出的异常对象。在回调函数中,我们可以对异常进行处理,例如打印异常信息、进行日志记录等。 - 返回结果:
exceptionally
方法返回一个新的CompletableFuture
,其结果是回调函数的返回值。在这个例子中,我们返回null
,因为我们只是处理异常,不需要返回特定的结果。 - 后续操作:
thenRun
方法会在异步任务正常完成或者异常被处理后执行。在这个例子中,无论任务是否抛出异常,thenRun
中的代码都会执行,打印出"任务结束"。
通过这种方式,CompletableFuture
提供了一种优雅的方式来处理异步任务中的异常,使得代码更加简洁和易于维护。