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() {
@Override
public void run() {
..work after futureTask completed
}
}, executorService);
如果您在添加回调时提交的任务已完成,它将立即运行。 使用addCallback
方法有一个缺点,即Runnable
无法访问future
产生的结果。 要访问Future
的结果,您需要使用FutureCallback
。
FutureCallback
FutureCallback
接受从Future
产生的结果,并指定onSuccess
和onFailure
方法。 这是一个例子:
class FutureCallbackImpl implements FutureCallback<String> {
@Override
public void onSuccess(String result){
.. work with result
}
@Override
public 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
。
资源资源
参考: Google Guava并发–我们的JCG合作伙伴 Bill Bejeck的《可编码的随机想法》博客中的ListenableFuture。
翻译自: https://www.javacodegeeks.com/2012/11/google-guava-concurrency-listenablefuture.html