該功能由[`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
```