该功能由[`Guava`](https://guava.dev/)封装而来
> 在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承`Thread`类还是实现`Runnable`接口,都无法获取到之前的执行结果。`Java`中,也提供了使用`Callable`和`Future`来实现获取任务结果的操作。`Callable`用来执行任务,产生结果,而`Future`用来获得结果。
> Guava `ListenableFuture`是可以监听的`Future`,它是对java原生Future的扩展增强。当任务完成时可以得到计算结果。如果希望计算完成时马上就拿到结果展示给用户或者做另外的计算,就必须使用另一个线程不断的查询计算状态。这样做会使得代码复杂,且效率低下。使用ListenableFuture,Guava会帮助检测Future是否完成了,如果完成就自动调用回调函数,这样可以减少并发程序的复杂度。
[TOC]
# 测试示例
```
@Test
public void executor() throws InterruptedException, ExecutionException {
// 执行任务,不监听结果
ExecutorHelper.submit(new MyRunnable("1"));
// 执行任务,监听结果1
ExecutorHelper.submit(new Callable<Result>() {
@Override
public Result call() throws Exception {
// 这里进行耗时异步运算
return R.succ("2");
}
}, new MyFutureCallback());
// 执行任务,监听结果2
ExecutorHelper.submit(new MyTask("3"));
// 执行任务
ListenableFuture<String> future1 = ExecutorHelper.submit(() -> "4");
// 处理结果
ListenableFuture<String> future2 = Futures.transform(future1, new Function<String, String>() {
@Override
public String apply(String input) {
return input + " transform";
}
}, MoreExecutors.directExecutor());
// 监听结果
Futures.addCallback(future2, new FutureCallback<String>() {
@Override
public void onSuccess(@Nullable String result) {
log.info(result);
}
@Override
public void onFailure(Throwable t) {
log.info(t.getMessage());
}
}, MoreExecutors.directExecutor());
}
```
辅助类
```
public static class MyRunnable implements Runnable {
public String result;
public MyRunnable(String result) {
this.result = result;
}
@Override
public void run() {
// 这里进行耗时异步运算
log.info(result);
}
}
public static class MyFutureCallback implements FutureCallback<Result> {
@Override
public void onSuccess(@Nullable Result result) {
log.info(result.getMsg());
}
@Override
public void onFailure(Throwable t) {
log.info(t.getMessage());
}
}
@AllArgsConstructor
public static class MyTask extends DefaultTask<Result> {
public String keyword;
@Override
public Result call() throws Exception {
// 这里进行耗时异步运算
return R.succ(keyword);
}
@Override
public void onSuccess(Result result) {
log.info(result.getMsg());
}
@Override
public void onFailure(Throwable t) {
log.info(t.getMessage());
}
}
```
# 验证结果
```
[FastBoot][ INFO][08-22 16:24:49]-->[pool-2-thread-1: 2411][run(ExecutorHelperTest.java:64)] | - 1
[FastBoot][ INFO][08-22 16:24:49]-->[main: 2421][onSuccess(ExecutorHelperTest.java:72)] | - 2
[FastBoot][ INFO][08-22 16:24:49]-->[pool-2-thread-1: 2426][onSuccess(ExecutorHelperTest.java:94)] | - 3
[FastBoot][ INFO][08-22 16:24:49]-->[main: 2432][onSuccess(ExecutorHelperTest.java:43)] | - 4 transform
```