CompletableFuture 可实现并发,主业务线程可以及时释放;异步线程完成工作,执行回调函数,完成善后工作;提高了执行效率。
例如,此时一个线程执行5个步骤的任务,此时第2步操作与后续的3步无关,此时第2步可以异步执行,让后面操作无需等待继续执行。
任务无返回值
public void testFutureVoid() throws ExecutionException, InterruptedException {
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " => Void");
});
System.out.println("如果这行代码先执行,说明 CompletableFuture 是异步的");
future.get(); // 获取异步执行的返回结果
}
任务有返回值(异步回调)
public void testFutureReturn() throws ExecutionException, InterruptedException {
// 供给型 异步执行任务
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName() + " => Integer");
// int i = 10 / 0;
return 1024;
});
// 捕获异常方式:来判断执行成功还是失败
try {
// 获取异步执行的返回结果
Integer integer = future.get();
System.out.println(integer);
} catch (InterruptedException | ExecutionException e) {
System.out.println("获取返回值失败");
}
// 异步回调方式:来判断执行成功还是失败
Integer result = future.whenComplete((t, u) -> {
System.out.println("t=>" + t);
System.out.println("u=>" + u);
}).exceptionally(e -> {
System.out.println(e.getMessage());
return 500;
}).get();
System.out.println("执行结果:" + result);
}