guava中的ListenableFuture

ListenableFuture还有其他几种内置实现:
  1. SettableFuture:不需要实现一个方法来计算返回值,而只需要返回一个固定值来做为返回值,可以通过程序设置此Future的返回值或者异常信息
  2. CheckedFuture: 这是一个继承自ListenableFuture接口,他提供了checkedGet()方法,此方法在Future执行发生异常时,可以抛出指定类型的异常。

SettableFuture
AbstractFuture抽象类实现了ListenableFuture接口,所以SettableFuture类也是ListenableFuture接口的一种实现,源码相当的简单,其中只包含了三个方法:
      1、一个用于创建SettableFuture实例的静态create()方法;
      2、set方法用于设置Future的值,返回是否设置成功,如果Future的值已经被设置或任务被取消,会返回false;
      3、setException与set方法类似,用于设置Future返回特定的异常信息,返回exception是否设置成功。
 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的返回值,我们也不需要再去执行异步任 务获取返回值。

AsyncFunction

接口返回的是 ListenableFuture,当我们需要接收AsyncFunction转换后的结果时,我们需要调用 ListenableFuture.get()方法。

AsyncFunction接口常被用于当我们想要异步的执行转换而不造成线程阻塞时,尽管Future.get()方法会在任务没有完成时造成阻塞,但 是AsyncFunction接口并不被建议用来异步的执行转换,它常被用于返回Future实例,我们来看下面的代码示例:

class AsyncFunctionSample implements
        AsyncFunction<Long, String> {
    private ConcurrentMap<Long, String> map = Maps.newConcurrentMap();
    private ListeningExecutorService listeningExecutorService;
    //这里简单的模拟一个service
    private Map<Long,String> service = new HashMap<Long, String>(){
        {
            put(1L,"retrieved");
        }
    };

    @Override
    public ListenableFuture<String> apply(final Long input) throws
            Exception {
        if (map.containsKey(input)) {
            SettableFuture<String> listenableFuture = SettableFuture.
                    create();
            listenableFuture.set(map.get(input));
            return listenableFuture;
        } else {
            return listeningExecutorService.submit(new Callable<String>() {
                @Override
                public String call() throws Exception {
                    //service中通过input获取retrieved
                    String retrieved = service.get(input);
                    map.putIfAbsent(input, retrieved);
                    return retrieved;
                }
            });
        }
    }
}

上面的例子是对AsyncFunction接口的一个简单实现,内部包含了ConcurrentHashMap的实例,当我们调用apply方法的时候, 我们会首先在我们的map中查询value值,传入的input对象充当了一个关键的key,如果我们在map中找到了相应的value值,我们使用 SettableFuture对象创建了一个Future对象,并且设置返回值等于从map中获取到的value值;否则的话,我们通过向 ExecutorService提交Callable返回Future对象,同样的,在相应的map中,为相应的key设置获取到的value值。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值