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