面试题答案
一键面试-
捕获异常并继续执行其他任务的方法:
- 使用
CompletableFuture.allOf
方法来等待所有异步任务完成。allOf
接受多个CompletableFuture
作为参数,并返回一个新的CompletableFuture
,当所有传入的CompletableFuture
都完成时,这个新的CompletableFuture
才完成。 - 对于每个
CompletableFuture
,可以使用exceptionally
方法来处理可能抛出的异常。exceptionally
方法接受一个Function
,当CompletableFuture
抛出异常时,这个Function
会被调用,返回一个替代结果。
- 使用
-
示例代码:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExceptionHandling {
public static void main(String[] args) {
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
// 模拟一个可能抛出异常的任务
if (Math.random() > 0.5) {
throw new RuntimeException("Task 1 failed");
}
return 10;
});
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
// 模拟一个正常执行的任务
return 20;
});
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);
allFutures.join(); // 等待所有任务完成
try {
Integer result1 = future1.exceptionally(ex -> {
System.out.println("Caught exception in future1: " + ex.getMessage());
return -1; // 异常时的替代结果
}).get();
Integer result2 = future2.get();
System.out.println("Result of future1: " + result1);
System.out.println("Result of future2: " + result2);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
在上述代码中:
future1
模拟了一个可能抛出异常的异步任务。future2
模拟了一个正常执行的异步任务。CompletableFuture.allOf
等待future1
和future2
都完成。future1.exceptionally
捕获future1
可能抛出的异常,并返回一个替代结果。- 最后通过
get
方法获取任务结果,future1
即使抛出异常也不会影响future2
的执行和结果获取。