一个能思想的人,才真是一个力量无边的人。——巴尔扎克
我们之前使用异步
public static ExecutorService executor = Executors.newFixedThreadPool(10);
final Future<Integer> submit = executor.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
print("原始异步Callable");
return 1;
}
});
executor.execute(new Runnable() {
@Override
public void run() {
LineUtils.print("原始异步Runnable");
}
});
现在咱们使用1.8
的CompletableFuture
package com.ruben;
import java.util.concurrent.*;
/**
* @ClassName: CompletableFutureDemo
* @Description: 我还没有写描述
* @Date: 2021/3/9 0009 21:13
* *
* @author: <achao1441470436@gmail.com>
* @version: 1.0
* @since: JDK 1.8
*/
public class CompletableFutureDemo {
public static ExecutorService executor = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
final CompletableFuture<Integer> async = CompletableFuture.supplyAsync(() -> {
System.out.println("1.8新版CompletableFuture调用Callable");
return 1;
});
final CompletableFuture<Void> future = CompletableFuture.runAsync(new Runnable() {
@Override
public void run() {
System.out.println("1.8新版CompletableFuture调用Runnable");
}
});
// 等待并获取结果
future.get();
// 在1秒后直接获取结果
future.get(1, TimeUnit.SECONDS);
// 立马获取结果,如果获取不到则等待完成再获取结果
future.getNow(CompletableFuture.allOf(future).get());
// 获取依赖任务数
future.getNumberOfDependents();
menu();
}
private static void menu() throws InterruptedException, ExecutionException {
// 无需返回值 5
CompletableFuture.runAsync(CompletableFutureDemo::runnable, executor);
CompletableFuture<Integer> future = CompletableFuture
// 带返回值 5
.supplyAsync(CompletableFutureDemo::supplier, executor)
// 成功执行后触发 5
.whenComplete(CompletableFutureDemo::biConsumer)
// 异常时触发
.exceptionally(CompletableFutureDemo::function)
// 结束时触发 1
.handle(CompletableFutureDemo::biFunction);
System.out.println(future.get());
// 串行
// 任务结束后执行 无返回值 不需要上次线程执行结果
future.thenRun(CompletableFutureDemo::runnable);
// 任务结束后执行 无返回值 需要上次线程执行结果
future.thenAccept(CompletableFutureDemo::consumer);
// 使用指定线程池创建线程异步执行带返回值 需要上次线程执行结果
Integer integer = future.thenApplyAsync(CompletableFutureDemo::function, executor).get();
System.out.println(integer);
// 两个任务都完成后 使用当前线程池创建线程异步执行 无返回值 不需要两个任务执行结果
future.runAfterBothAsync(future, CompletableFutureDemo::runnable);
// 两个任务都完成后执行 无返回值 需要两个任务执行结果
future.thenAcceptBoth(future, CompletableFutureDemo::biConsumer);
// 两个任务都完成后执行 带返回值 需要两个任务执行结果
future.thenCombine(future, CompletableFutureDemo::biFunction);
// 两个任务只要有一个执行完成就执行 无返回值 不需要上次线程执行结果
future.runAfterEither(future, CompletableFutureDemo::runnable);
// 两个任务只要有一个执行完成就执行 无返回值 需要上次线程执行结果
future.acceptEither(future, CompletableFutureDemo::consumer);
// 两个任务只要有一个执行完成就执行 带返回值 需要上次线程执行结果
future.applyToEither(future, CompletableFutureDemo::function);
// 任何一个执行完成
CompletableFuture.anyOf(future, future, future).get();
// 等待所有结果完成
CompletableFuture.allOf(future, future, future).get();
}
public static Integer function(Throwable throwable) {
System.out.println("function:" + Thread.currentThread().getId());
return 0;
}
public static Integer function(Integer integer) {
System.out.println("function:" + Thread.currentThread().getId());
System.out.println(integer);
integer++;
return integer;
}
public static Integer biFunction(Integer integer, Throwable throwable) {
System.out.println("biFunction:" + Thread.currentThread().getId());
return 1;
}
public static Integer biFunction(Integer integer, Integer integer1) {
System.out.println("biFunction:" + Thread.currentThread().getId());
return integer + integer1;
}
public static void consumer(Integer integer) {
System.out.println("consumer:" + Thread.currentThread().getId());
function(integer);
}
public static void biConsumer(Integer integer, Throwable throwable) {
System.out.println("biConsumer:" + Thread.currentThread().getId());
consumer(integer);
throw new RuntimeException();
}
public static void biConsumer(Integer integer, Integer integer1) {
System.out.println("biConsumer:" + Thread.currentThread().getId());
System.out.println(integer + integer1);
}
public static int supplier() {
System.out.println("supplier:" + Thread.currentThread().getId());
int i = 10 / 2;
System.out.println(i);
return i;
}
public static void runnable() {
System.out.println("runnable:" + Thread.currentThread().getId());
supplier();
}
}