链接地址:http://www.xx566.com/detail/162.html
上一篇,Guava库学习:学习Concurrency(六)AsyncFunction中, 我们简单觉得介绍了AsyncFuction接口,AsyncFuction接口是Function接口的异步表现,可以被用来异步的执行转换,不过常被 用来返回ListenableFuture实例,本篇我们继续Guava Concurrency的学习:Concurrency(七)FutureFallback。
Guava官方这样定义FutureFallback接口:Provides a backup Future to replace an earlier failed Future。提供一个Future的备用来替代之前失败的Future;Getting Started With Google Guava中这样解释:The FutureFallback interface is used as a backup or a default value for a Future instance that has failed。在Future实例失败后常被用来作为Future的备份或者默认的值。
翻开FutureFallback的源码,我们看到FutureFallback接口只提供了一个方法: ListenableFuture<V> create(Throwable t),通过接收一个Throwable 实例,我们可以决定是尝试恢复失败的Future,返回默认的Future,或者传播这个异常。来看下面的代码示 例:
class FutureFallbackImpl implements FutureFallback<String> {
@Override
public ListenableFuture<String> create(Throwable t) throws
Exception {
if (t instanceof FileNotFoundException) {
SettableFuture<String> settableFuture =
SettableFuture.create();
settableFuture.set("Not Found");
return settableFuture;
}
throw new Exception(t);
}
}
接下来简单的解释一下上面的示例:假设我们试图异步的检索文件的名称,但是没有找到,不过没有关系,我们首先判断了异常的类型,当捕获到找不到文件的异常 时,我们通过SettableFuture构造了一个Future对象,并且将其值设置为“Not Found”,然后将其返回,如果是其他的异常,我们可以继续传播此异常。
更多SettableFuture,请参阅Guava库学习:学习Concurrency(五)SettableFuture。
总结:在之前Guava库学习:学习Concurrency(四)FutureCallback中,我们学习了FutureCallback,用于处理Future成功或失败后的回调函数,本篇所学习的FutureFallback则被用作Future失败后的“备胎”,两者的英文拼写非常的相似,但是使用的地方以及作用有很大的不同,需要特别区分开来。
示例代码地址:http://git.oschina.net/realfighter/xx566-diary/blob/master/src/guava/FutureFallbackTest.java