Monitor
类。 在本文中,我将继续介绍Guava并发实用程序,并讨论ListenableFuture
接口。 ListenableFuture
通过添加接受完成侦听器的方法,从java.util.concurrent包扩展了Future
接口。 可听的未来
ListenableFuture
行为与java.util.concurrent.Future
完全相同,但是具有方法addCallback(Runnable, ExecutorService)
在给定的executor
中执行回调。 这是一个例子:
ListenableFuture futureTask = executorService.submit(callableTask)futureTask.addListener(new Runnable() {@Overridepublic void run() {..work after futureTask completed}}, executorService);
如果您在添加回调时提交的任务已完成,它将立即运行。 使用addCallback
方法有一个缺点,即Runnable
无法访问future
产生的结果。 要访问Future
的结果,您需要使用FutureCallback
。
FutureCallback
FutureCallback
接受从Future
产生的结果,并指定onSuccess
和onFailure
方法。 这是一个例子:
class FutureCallbackImpl implements FutureCallback<String> {@Overridepublic void onSuccess(String result){.. work with result}@Overridepublic void onFailure(Throwable t) {... handle exception}}
通过使用Futures类中的addCallback
方法来附加FutureCallback
:
Futures.addCallback(futureTask, futureCallbackImpl);
此时,您可能会问,当ExecutorService
仅返回Futures
时,如何获取ListenableFuture
实例? 答案是使用ListenableExecutionService
。
ListenableExecutionService
要使用ListenableExecutionService
只需使用对MoreExecutors.listeningDecorator(ExecutorService)
的调用来装饰ExecutorService
实例,例如:
ExecutorsService executorService = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
结论
借助添加回调(无论是Runnable
还是处理成功和失败条件的FutureCallback
功能, ListenableFuture
可能会成为您的武器库的宝贵补充。 我创建了一个单元测试使用证明ListenableFuture
可以作为一个依据 。 在我的下一个职位,我要覆盖Futures
类,它包含与工作静态方法futures
。
资源资源
- 番石榴项目首页
- ListenableFuture API
- 样例代码
参考: Google Guava并发–我们的JCG合作伙伴 Bill Bejeck的《可编码的随机想法》博客中的ListenableFuture。
翻译自: https://www.javacodegeeks.com/2012/11/google-guava-concurrency-listenablefuture.html