Guava并发:SettableFuture与CheckedFuture

上一篇介绍了下guava关于并发的实现与支持,其中涉及到两个内置接口实现,分别是SettableFuture与Checkedfuture,今天分别介绍下这两种内置实现:

1、SettableFuture

      查看源码,我们可以发现,SettableFuture继承了AbstractFuture抽象 类,AbstractFuture抽象类实现了ListenableFuture接口,所以SettableFuture类也是 ListenableFuture接口的一种实现。

      源码如下:public final class SettableFuture<V> extends AbstractFuture<V>

     我们发现源码中,其中只包含了三个方法,一个用于创建SettableFuture实例的静态 create()方法;set方法用于设置Future的值,返回是否设置成功,如果Future的值已经被设置或任务被取消,会返回 false;setException与set方法类似,用于设置Future返回特定的异常信息,返回exception是否设置成功。

    源码三个方法如下:

    /**
* Creates a new {@code SettableFuture} in the default state.
*/
public static <V> SettableFuture<V> create() {
return new SettableFuture<V>();
}

/**
* Explicit private constructor, use the {@link #create} factory method to
* create instances of {@code SettableFuture}.
*/
private SettableFuture() {}

/**
* Sets the value of this future. This method will return {@code true} if
* the value was successfully set, or {@code false} if the future has already
* been set or cancelled.
*
* @param value the value the future should hold.
* @return true if the value was successfully set.
*/
@Override
public boolean set(@Nullable V value) {
return super.set(value);
}

SettableFuture类是ListenableFuture接口的一种实现,我们可以通过SettableFuture设置Future的返回 值,或者设置Future返回特定的异常信息,可以通过SettableFuture内部提供的静态方法create()创建一个 SettableFuture实例,下面是一个简单的例子:

 SettableFuture sf = SettableFuture.create();
//设置成功后返回指定的信息
sf.set("SUCCESS");
//设置失败后返回特定的异常信息
sf.setException(new RuntimeException("Fails"));

   通过上面的例子,我们看到,通过create()方法,我们可以创建一个默认的ettableFuture实例,当我们需要为Future实例设置一个返 回值时,我们可以通过set方法,设置的值就是Future实例在执行成功后将要返回的值;另外,当我们想要设置一个异常导致Future执行失败,我们 可以通过调用setException方法,我们将给Future实例设置指定的异常返回。
    当我们有一个方法返回Future实例时,SettableFuture会显得更有价值,但是已经有了Future的返回值,我们也不需要再去执行异步任 务获取返回值。

2、附上自己写的一个完整调用:public ListenableFuture<Response> asyncExecuteHttp(Request request) {
final SettableFuture<Response> future = SettableFuture.create();
httpClient.executeRequest(request, new AsyncCompletionHandler<Response>(){

@Override
public Response onCompleted(Response response) throws Exception {
future.set(response);
return response;
}

@Override
public void onThrowable(Throwable t) {
logger.error(t.getMessage(), t);
super.onThrowable(t);
future.setException(t);
}

});

return future;
}

3、关于CheckedFuture后续介绍

猜你喜欢

转载自blog.csdn.net/lb7758zx/article/details/74322074