获取正常返回值方法
join()
方法:此方法会阻塞当前线程,等待CompletableFuture
完成并返回结果。如果CompletableFuture
异常完成,join()
方法会抛出未检查异常(CompletionException
或ExecutionException
等)。
get()
方法:同样会阻塞当前线程等待结果。与join()
不同的是,get()
方法会抛出已检查异常(InterruptedException
和ExecutionException
)。
捕获异常信息方法
exceptionally()
方法:当CompletableFuture
异常完成时,会执行exceptionally()
方法中的回调函数,返回一个替代结果。
whenComplete()
方法:无论CompletableFuture
正常完成还是异常完成,都会执行whenComplete()
方法中的回调函数,可在其中检查异常。
handle()
方法:结合了获取结果和处理异常的功能,无论正常或异常完成,都会执行该方法中的回调函数,返回一个新的CompletableFuture
。
代码示例
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) {
// 创建一个CompletableFuture
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 模拟一个可能会抛出异常的任务
if (Math.random() < 0.5) {
throw new RuntimeException("任务执行失败");
}
return "任务执行成功";
});
// 使用join()获取结果
try {
String result1 = future.join();
System.out.println("join()获取的结果: " + result1);
} catch (Exception e) {
System.out.println("join()捕获的异常: " + e.getMessage());
}
// 使用get()获取结果
try {
String result2 = future.get();
System.out.println("get()获取的结果: " + result2);
} catch (InterruptedException | ExecutionException e) {
System.out.println("get()捕获的异常: " + e.getMessage());
}
// 使用exceptionally()处理异常
CompletableFuture<String> futureWithExceptionally = future.exceptionally(ex -> {
System.out.println("exceptionally()捕获的异常: " + ex.getMessage());
return "默认结果";
});
futureWithExceptionally.thenAccept(System.out::println);
// 使用whenComplete()处理异常
future.whenComplete((result, ex) -> {
if (ex != null) {
System.out.println("whenComplete()捕获的异常: " + ex.getMessage());
} else {
System.out.println("whenComplete()获取的结果: " + result);
}
});
// 使用handle()处理异常
CompletableFuture<String> futureWithHandle = future.handle((result, ex) -> {
if (ex != null) {
System.out.println("handle()捕获的异常: " + ex.getMessage());
return "默认结果";
}
return result;
});
futureWithHandle.thenAccept(System.out::println);
}
}