一、CompletableFuture 的四个执行方法
- runAsync(Runnable runnable): 使用默认线程池(ForkJoinPool)异步执行任务(无返回值)
- runAsync(Runnable runnable, Executor executor): 使用自定义线程池执行异步任务(无返回值)
- supplyAsync(Supplier supplier): 使用默认线程池(ForkJoinPool)异步执行任务(有返回值)
- supplyAsync(Supplier supplier,Executor executor): 使用自定义线程池执行异步任务(有返回值)
二、异步任务完成时回调
方法后面加了 Async 表示异步执行,即从线程池(当未使用自定义线程池时,默认从 ForkJoinPool.commonPool-worker中获取线程)中重新选择线程;如果没有加,表示使用返回当前结果的线程执行
handle() 或 handleAsync()
异步任务执行完成后对结果再次处理 参数为BiFunction 有返回值
private static void handleAsync() throws Exception {
Integer val = CompletableFuture.supplyAsync(() -> {
System.out.println("执行异步任务");
// 模拟异常情况
//int i = 1 / 0;
return 1;
}).handleAsync((result,exception)->{
//方法执行完成后的处理
System.out.println("异步任务执行结果:" + result+ " 异常:" + exception);
// 对执行结果二次处理
if (result!=null) return result+ 100;
return 0;
}).get();
// 未发生异常时 执行结果为 101 发生异常情况时 结果为 0
System.out.println(val);
}
whenComplete() 或 whenCompleteAsync()
方法完成后的感知,无返回值
exceptionally()
仅异步任务执行异常时执行
private static void whenCompleteAsync() throws Exception {
Integer val = CompletableFuture.supplyAsync(() -> {
System.out.println("执行异步任务");
// 模拟异常情况
//int i = 1 / 0;
return 1;
}).whenCompleteAsync((result, exception) -> {
/**
* 注意 此处只能获取到异步任务执行结果,无法对结果进行二次处理
*/
System.out.println("异步任务执行结果:" + result + " 异常:" + exception);
}).exceptionally((exception) -> {
// 当任务执行异常时,此处才会执行
System.out.println("异步任务执行异常:" + exception);
return 0;
}).get();