一、概览
- 没有指定Executor的方法会使用ForkJoinPool.commonPool() 作为它的线程池执行异步代码。
二、创建CompletableFuture对象
/** 比较特殊,他入参就是返回值,也就是说他可以用来执行需要其他返回值的异步任务。 */
public static <U> CompletableFuture<U> completedFuture(U value)
/** 无返回值,使用默认线程池 */
public static CompletableFuture<Void> runAsync(Runnable runnable)
/** 无返回值,使用自定义线程池 */
public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor)
/** 有返回值,使用默认线程池 */
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)
/** 有返回值,使用自定义线程池 */
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)
示例
CompletableFuture<String> supplyAsync = CompletableFuture.supplyAsync(() -> "测试CompletableFuture");
System.out.println(supplyAsync.get());
三、CompletableFuture对象操作
1.计算结果完成时的回调方法
当CompletableFuture的计算结果完成,或者抛出异常的时候,可以执行特定的Action。没法修改返回结果。
// BiConsumer<T,U> 函数接口有两个参数,无返回值。
// Function<T,R> 函数接口有一个输入参数,返回一个结果。
/** 无Async,同步处理正常计算结果或异常,使用执行任务的那个线程来执行该方法,所以这个方法是同步的。 */
public CompletableFuture<T> whenComplete(BiConsumer<? super T,? super Throwable> action)
/** 有Async,异步处理正常计算结果或异常,使用执行任务的那个线程池中的线程来执行该方法!所以这个方法是异步的。 */
public CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T,? super Throwable> action)
/** 有Async,异步处理正常计算结果或异常,使用自定义线程池来执行该方法,所以这个方法是异步的。 */
public CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T,? superThrowable> action, Executor executor)
/** 处理异常。 */
public CompletableFuture<T> exceptionally(Function<Throwable,? extends T> fn)
whenComplete
和 whenCompleteAsync
的区别:
whenComplete
:是执行当前任务的线程执行继续执行 whenComplete
的任务。
whenCompleteAsync
:是执行把 whenCompleteAsync
这个任务继续提交给线程池来进行执行。
2.handle 方法
handle 是执行任务完成时对结果的处理。thenApply 只可以执行正常的任务。