guava中的ListenableFuture

来源:互联网 发布:淘宝卖家不开发票 编辑:程序博客网 时间:2024/05/17 04:42
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
原创粉丝点击