创建异步对象
CompletableFuture 提供了四个静态方法来创建一个异步操作。
```java
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)
``
方法分为两类:
* runAsync 没有返回结果
* supplyAsync 有返回结果
* whenComplete 可以获取异步任务的返回值和抛出的异常信息,但是不能修改返回结果
* execptionlly 当异步任务跑出了异常后会触发的方法,如果没有抛出异常该方法不会执行
* handleAsync 可以获取异步任务的返回值和抛出的异常信息,而且可以显示的修改返回的结果
当CompletableFuture的计算结果完成,或者抛出异常的时候,可以执行特定的Action
package com.msb.mall.mallsearch;
import java.util.concurrent.*;
/**
* @author lcc
* @version V1.0
* @Package com.msb.mall.mallsearch
* @date 2022/6/7 19:01
* CompletableFuture 介绍
*/
public class CompletableFutureDemo {
private static ThreadPoolExecutor executor=new ThreadPoolExecutor(5,
50,
10,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
//运行时发现 线程会阻塞 等待新的任务去调度
public static void main(String[] args) throws ExecutionException, InterruptedException {
System.out.println("主线程开始了");
//获取CompletableFuture对象
CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync(() -> {
System.out.println("线程开始了");
int i=100/50;
System.out.println("线程结束了");
},executor);
System.out.println("主线程结束了");
System.out.println("------------");
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
System.out.println("线程开始了");
int i = 100 / 10;
System.out.println("线程结束了");
return i;
}, executor).handleAsync((res, throwable) -> {
System.out.println("res = " + res+" throwable="+throwable);
return res*10;//这个既可以获得上面执行的结果 也可以修改 返回值
});
//可以处理异步任务之后的操作
System.out.println("获取线程的返回结果是"+future.get());
}
/* public static void main(String[] args) throws ExecutionException, InterruptedException {
System.out.println("主线程开始了");
//获取CompletableFuture对象
CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync(() -> {
System.out.println("线程开始了");
int i=100/50;
System.out.println("线程结束了");
},executor);
System.out.println("主线程结束了");
System.out.println("------------");
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
System.out.println("线程开始了");
int i = 100 / 10;
System.out.println("线程结束了");
return i;
}, executor).whenCompleteAsync((res, exec) -> {
System.out.println(res);//可以拉取到上面的执行结果
System.out.println(exec);//获取到异常
}).exceptionally(res -> {//捕捉到异常 只有发生异常后才会调用此方法 可以改变方法返回结果 然后进行处理
System.out.println("res"+res);
return 10;
});
//可以处理异步任务之后的操作
System.out.println("获取线程的返回结果是"+future.get());
}*/
}
* whenComplete 可以获取异步任务的返回值和抛出的异常信息,但是不能修改返回结果
* execptionlly 当异步任务跑出了异常后会触发的方法,如果没有抛出异常该方法不会执行
* handle 可以获取异步任务的返回值和抛出的异常信息,而且可以显示的修改返回的结果