目录
2.1.2、创建一个使用指定数据作为结果的已结束的CompletableFuture
2.1.3、通过执行异步任务获取CompletableFuture
2.4.2、 AND(thenCombine,thenAcceptBoth,runAfterBoth)
一、CompletableFuture是什么
CompletableFuture是对Future的扩展和增强。CompletableFuture实现了Future接口和CompletionStage使其实现了对任务编排的能力,支持其在完成时触发相关功能或操作。借助这项能力,可以轻松地组织不同任务的运行顺序、规则以及方式。
二、CompletableFuture用法
2.1、创建CompletableFuture
2.1.1、直接创建
CompletableFuture completableFuture=new CompletableFuture();
2.1.2、创建一个使用指定数据作为结果的已结束的CompletableFuture
CompletableFuture<String> test1 = CompletableFuture.completedFuture("test");
2.1.3、通过执行异步任务获取CompletableFuture
/**
* 使用默认线程池执行异步任务,有返回值
*/
CompletableFuture.supplyAsync(() -> "hello CompletableFuture!");
/**
* 使用指定线程池执行异步任务,有返回值
*/
CompletableFuture.supplyAsync(() -> "Hello CompletableFuture!", Executors.newCachedThreadPool());
/**
* 使用默认线程池执行异步任务,无返回值
*/
CompletableFuture.runAsync(() -> System.out.println("Hello runAsync!"));
/**
* 使用指定线程池执行异步任务,无返回值
*/
CompletableFuture.runAsync(() -> System.out.println("Hello RunAsync!"), Executors.newCachedThreadPool());
2.2、获取任务结果
方法 | 是否阻塞 | 是否抛出检查异常 | 说明 |
get() | 阻塞 | 抛出检查异常 | |
getNow(V value) | 不阻塞 | 不抛出 | 如果任务没有结束就返回指定的默认值 |
get(long timeout, TimeUnit unit) | 阻塞指定时间 | 抛出 | |
join() | 阻塞 | 不抛出 |
示例代码:
/**
* 获取任务结果,阻塞直到任务结束,会抛出检查异常
*/
String test = CompletableFuture.supplyAsync(() -> "Hello").get();
/**
* 获取任务结果,如果超过等待之间任务未结束则抛出TimeoutException
*/
test = CompletableFuture.supplyAsync(() -> "test").get(10, TimeUnit.MILLISECONDS);
/**
* 如果任务结束则返回任务结果,如果任务未结束则返回指定的默认值
*/
test = CompletableFuture.supplyAsync(() -> "test").getNow("default");
/**
* 阻塞获取任务结果,和get相似,但是不会抛出检查异常
*/
test = CompletableFuture.supplyAsync(() -> "join").join();
2.3、消费结果
2.3.1、whenComplete
whenComplete是当某个任务执行完成后执行的回调方法,不管任务异常还是正常结束都会执行该回调;该回调的入参是任务的执行结果和异常;
如果是正常执行则异常为null,回调方法对应的CompletableFuture的result和该任务一致,如果该任务正常执行,则get方法返回执行结果,如果是执行异常,则get方法抛出异常。
方法 | 说明 |
whenComplete(BiConsumer<? super T, ? super Throwable> action ) | 在当前线程中同步执行回调操作 |