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