文档地址:
https://www.matools.com/api/java8
https://blog.csdn.net/sl1992/article/details/100677099
![](https://img2020.cnblogs.com/blog/1683407/202101/1683407-20210126150118694-197757916.png)
package com.example.netty.async;
import java.util.concurrent.*;
/**
* @author luliang
* @date 2021-01-25 14:21
* CompletableFuture;异步执行
* 文档地址:
* https://www.matools.com/api/java8
* https://blog.csdn.net/sl1992/article/details/100677099
*/
public class CompletableFutureTest {
//一、CompletableFuture的静态方法
public void staticMethod() {
ExecutorService executorService = Executors.newSingleThreadExecutor();
//1、异步执行,有返回值,使用ForkJoinPool.commonPool()中的线程
CompletableFuture.supplyAsync(() -> null);
//2、异步执行,有返回值,使用Executors中的线程
CompletableFuture.supplyAsync(() -> null, executorService);
//3、异步执行,无返回值,使用ForkJoinPool.commonPool()中的线程
CompletableFuture.runAsync(() -> {
});
//4、异步执行,无返回值,使用Executors中的线程
CompletableFuture.runAsync(() -> {
}, executorService);
//3、使用给定值进行操作
CompletableFuture.completedFuture(1).thenApply((s) -> s + 3);
//4、当所有给定的CompletableFutures完成时
CompletableFuture.allOf();
//5、当任何一个给定的CompletableFutures完成
CompletableFuture.anyOf();
}
//二、普通方法
public static void method(CompletableFuture<Integer> futureA, CompletableFuture<Integer> futureB) throws Exception {
/**
* 哪个线程跑的最快用那个,无返回值
* 1、supplyAsync与acceptEitherAsync(默认的线程池)与acceptEitherAsync(给定的线程池)
*/
CompletableFuture<Void> futureVoid = futureB.acceptEitherAsync(futureA, (s) -> System.out.println(s));
/**
* 哪个线程跑的最快用那个,有返回值
* 2、applyToEither与applyToEitherAsync(默认的线程池)与applyToEitherAsync(给定的线程池)
*/
CompletableFuture<Integer> futureC = futureB.applyToEitherAsync(futureA, (o -> o));
/**
* 3、终止任务,如果未完成,抛出CancellationException
*/
//futureB.cancel(true);
/**
* 4、终止任务,返回给定的值
*/
futureB.complete(99);
/**
* 5、终止任务,如果未完成,调用 get()和相关方法时抛出指定异常信息
*/
futureB.completeExceptionally(new Exception("结束异常"));
/**
* 6、如果CompletableFuture出现异常,则执行exceptionally,否则正常返回
* exceptionally
*/
CompletableFuture<Integer> futureAll = CompletableFuture.supplyAsync(() -> 1 / 1).exceptionally((t) -> {
System.out.println("异常信息" + t);
return 10;
});
/**
* 7、获取执行结果,会阻塞,抛出异常
*/
futureB.get();
/**
* 8、获取执行结果,设置等待时间(超时时间)
*/
futureB.get(1, TimeUnit.MINUTES);
/**
* 9、获取执行结果,如果执行完成则返回结果或抛出异常,否则返回给定值
*/
futureA.getNow(100);
/**
*10、将CompletableFuture执行结果或异常信息作为参数,进行执行
* handle、handleAsync(默认线程池)、handleAsync(自定义线程池)
*/
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 10 / 0);
future.handle((s, t) -> {
System.out.println("参数" + s);
System.out.println("异常信息" + t);
return null;
});
/**
* 11、如果以任何方式完成,返回true,否则false
*/
futureA.isDone();
/**
* 12、在正常完成之前被取消,则返回 true
*/
futureA.isCancelled();
/**
* 13、以任何方式异常完成包括取消,则返回true
*/
futureA.isCompletedExceptionally();
/**
* 14、获取执行结果,没有检查异常,不会强制抛出异常
*/
Integer join = futureA.join();
/**
* 15、强制返回结果,不管是否执行完成
*/
futureA.obtrudeValue(100);
/**
* 16、强制抛出异常,无论是否执行完成
*/
futureA.obtrudeException(new Exception("异常"));
/**
*17、两个异步线程都执行完毕后,执行线程C
* runAfterBoth、runAfterBothAsync(默认线程池)、runAfterBothAsync(自定义线程池)
*/
futureA.runAfterBoth(futureB, () -> {
});
/**
* 18、两个线程有任何一个执行完毕,执行线程C
* runAfterEither、runAfterEitherAsync(默认线程池)、runAfterEitherAsync(自定义线程池)
*/
futureA.runAfterEither(futureB, () -> {
});
/**
* 19、当此阶段正常完成时,将以该阶段的结果作为参数执行,无返回值
* thenAccept、thenAcceptAsync(默认线程池)、thenAcceptAsync(自定义线程池)
*/
futureA.thenAccept((v) -> System.out.println());
/**
* 20、当此阶段正常完成时,将以该阶段的结果作为参数执行,有返回值
* thenApply、thenApplyAsync(默认线程池)、thenApplyAsync(自定义线程池)
*/
futureA.thenApply((v) -> v);
/**
* 21、两个线程执行完毕后,将两个线程的结果作为参数进行执行,无返回值
* thenAcceptBoth、thenAcceptBothAsync(默认线程池)、thenAcceptBothAsync(自定义线程池)
*/
futureA.thenAcceptBoth(futureB, (f1, f2) -> {
});
/**
* 22、两个线程执行完毕后,将亮哥哥线程的结果作为参数进行执行,有返回值
*/
futureA.thenCombine(futureB, (f1, f2) -> null);
/**
* 23、此阶段正常完成时,将以该阶段的结果作为参数执行,有返回值
* thenCompose、thenComposeAsync、thenComposeAsync
* 不指定泛型,类型为Object,
*/
futureA.thenCompose((f1) -> null);
/**
* 22、正常完成时,执行此操作,无返回值
* thenRun、thenRunAsync、thenRunAsync
*/
futureA.thenRun(() -> {
});
/**
* 23、返回此CompletableFuture
*/
futureA.toCompletableFuture();
/**
* 24、当此阶段完成时,以此阶段的结果(如果没有则为null)和异常(如果没有则为null)作为参数来调用给定操作。
* 返回阶段在操作返回时完成。如果提供的操作本身遇到异常,那么除非此阶段也异常完成,否则返回的阶段将异常完成。
*/
futureA.whenComplete((f1, t) -> {
});
}
public static void main(String[] args) throws Exception {
CompletableFuture<Integer> futureA = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A执行完毕" + Thread.currentThread().getId());
return 1;
});
CompletableFuture<Integer> futureB = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("B执行完毕" + Thread.currentThread().getId());
return 2;
});
method(futureA, futureB);
while (true) {
}
}
}