在 Java8 中,有 CompletableFuture 类,帮助简化了异步编程的复杂性。
一、创建异步对象
Completable 提供了四个静态方法创建异步操作。
import java.util.concurrent.*;
public class CompletableFutureTest {
// 创建一个线程池
public static ExecutorService executor =Executors.newFixedThreadPool(10);
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 无返回结果 , 且使用默认线程池
// result: ForkJoinPool.commonPool-worker-1 === > runAsync(runnable)
CompletableFuture.runAsync(
()-> System.out.println(Thread.currentThread().getName()+" === > runAsync(runnable)"));
// 无返回结果 , 且使用自定义线程池
// result: pool-1-thread-1 === > runAsync(runnable,executor)
CompletableFuture.runAsync(
()-> System.out.println(Thread.currentThread().getName()+" === > runAsync(runnable,executor)"), executor);
// 有返回结果 , 且使用默认线程池
// result: main get result : ForkJoinPool.commonPool-worker-1 === > supplyAsync(supplier)
CompletableFuture<String> supply1 = CompletableFuture.supplyAsync(
() -> Thread.currentThread().getName() + " === > supplyAsync(supplier)");
System.out.println(Thread.currentThread().getName()+" get result : "+supply1.get());
// 有返回结果 , 且使用自定义线程池
// result: main get result : pool-1-thread-2 === > supplyAsync(supplier,executor)
CompletableFuture<String> supply2 = CompletableFuture.supplyAsync(
() -> Thread.currentThread().getName() + " === > supplyAsync(supplier,executor)",executor);
System.out.println(Thread.currentThread().getName()+" get result : "+supply2.get());
}
}
二、 异步对象完成后的回调
在上述异步对象完成后,可以回调对应方法
方法中有后缀 Async 的表示异步执行(利用新的线程去处理),否则继续利用同一个线程处理。
方法中有带 Executor 参数 的,表示可以传入自定义的线程池,利用其中的线程进行处理。
whenComplete* 方法可以获取到上一个 Future 的 结果 或 异常 。
(1) whenCo