JUC高级多线程_10:Future异步回调的具体介绍与使用
Posted ABin-阿斌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUC高级多线程_10:Future异步回调的具体介绍与使用相关的知识,希望对你有一定的参考价值。
我是 ABin-阿斌:写一生代码,创一世佳话。 如果小伙伴们觉得我的文章有点 feel ,那就点个赞再走哦。
1.Future简介
- Future 是 java1.5 引入的一个 interface,可以方便的用于异步结果的获取。
- Future 代表的是异步执行的结果,意思是当异步执行结束之后,返回的结果将会保存在 Future 中。
2.Future的使用场景
- 当我们执行一个长时间运行的任务时,使用 Future 就可以让我们暂时去处理其他的任务,等长任务执行完毕再返回其结果。
- 当我们需要进行大量数据处理的时候
- 当我们需要调用远程方法时
- 涉及到复杂的密集计算时
3.Future的具体使用
3.1 对应的方法介绍
- CompletableFuture.runAsync(): 没有返回值
源码展示:
案例展示:
public static void main(String[] args) throws Exception {
/**
* CompletableFuture.runAsync():没有返回值
*/
//需要传入一个 Runnable 接口类型的参数
CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
try {
//设置睡眠时间
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":执行任务————>runAsync<————没有返回值");
});
//获取阻塞执行结果值
completableFuture.get();
- CompletableFuture.supplyAsync() :有返回值
源码展示:
- whenComplete: 参数列表 (T t,U u),如果执行过程正常完成,则执行该分支
- 参数介绍: BiConsumer ——> Binary Consumer ,也就是需要两个参数 (T,U),且没有返回值
源码展示:
- exceptionally: 如果执行任务出现异常,则执行 exceptionally 中的代码块,并且需要一个返回值
源码展示:
- 注意: 这里的参数是一个 Function 类型的函数式接口
案例展示:
public static void main(String[] args) throws Exception {
/**
* CompletableFuture.supplyAsync():有返回值
*/
CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName() + ":执行任务————>supplyAsync<————有返回值");
int a = 10 / 0;
return 200;
});
//whenComplete:参数列表 (T t, U u),如果执行过程正常完成,则执行该分支
System.out.println(completableFuture.whenComplete((t, u) -> {
System.out.println("————>异步回调结果:" + t);
System.out.println("————>异常信息结果:" + u);
//exceptionally :如果执行过程出现异常,则走该分支
}).exceptionally((f) -> {
System.out.println("—————>异常详细信息:" + f.getMessage());
return 500;
}).get());
}
}
输出结果展示: 有异常
输出结果展示: 无异常
以上是关于JUC高级多线程_10:Future异步回调的具体介绍与使用的主要内容,如果未能解决你的问题,请参考以下文章
JUC高级多线程_09:ForkJoin框架的具体介绍与使用