博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Guava库学习:学习Concurrency(八)Futures
阅读量:5743 次
发布时间:2019-06-18

本文共 6863 字,大约阅读时间需要 22 分钟。

hot3.png

    链接地址:

    Futures是Guava Concurrency提供的用于处理Future实例的工具类,其中提供了需要有用方便的方法,一些方法的使用也有特定的场景,之前的学习中,我们提到 了AsyncFution和FutureFallback,本篇我们重点来学习一些与之相关的方法:AsyncFunctions 以及FutureFallbacks。

 

    之前的学习中,我们已经学习到了Futures的一些方法,如:Futures.addFallback,用于注册一个FutureCallback实例,在ListenableFuture实例完成其任务后执行。

 

    异步转换

    中,我们学习了AsyncFunction接口,以及如何接收Fuction进行异步的转换,Futures提供了transform方法,使我们能够简便的使用AsyncFunction接口:

@Testpublic void testFuturesTransform() throws ExecutionException, InterruptedException {    listenableFuture = executorService.submit(new Callable
() {        @Override        public String call() throws Exception {            return "张三";        }    });    AsyncFunction
 asyncFunction = new AsyncFunction
() {        @Override        public ListenableFuture
 apply(String input) throws Exception {            person.setName(input);            return executorService.submit(new Callable
() {                @Override                public Person call() throws Exception {                    return person;                }            });        }    };    ListenableFuture
 lf =            Futures.transform(listenableFuture, asyncFunction);    assertThat(lf.get().getName(), is("张三"));}

    

    Futures.transform方法返回了一个ListenableFuture实例,其结果是通过对从传递到方法中的ListenableFuture的执行结果进行一个异步的转换。

 

    FutureFallbacks的应用

 

    中,我们同样学习了FutureFallback接口,能够帮助我们处理ListenableFuture执行出现的错误信息,Futures.withFallback方法使用类似的方法注册FutureFallback,我们可以像下面这样使用:

@Testpublic void testFuturesFallback() throws ExecutionException, InterruptedException {    listenableFuture = executorService.submit(new Callable
() {        @Override        public String call() throws Exception {            throw new RuntimeException();        }    });    FutureFallback
 futureFallback = new FutureFallback
() {        @Override        public ListenableFuture create(Throwable t) throws Exception {            if (t instanceof RuntimeException) {                SettableFuture
 settableFuture =                        SettableFuture.create();                settableFuture.set("Not Found");                return settableFuture;            }            throw new Exception(t);        }    };    ListenableFuture
 lf =            Futures.withFallback(listenableFuture,futureFallback);    assertThat(lf.get(), is("Not Found"));}

    Futures.withFallback方法返回了一个ListenableFuture实例,其接收一个listenableFuture参数和 futureFallback参数,如果给定的listenableFuture执行成功,则返回成功的结果,如果失败,则返回 FutureFallback中设置的错误信息。

 

    接下来,我们翻开Futures的源码,简单的整理一下其中的公共方法,如下:

makeChecked( ListenableFuture<V> future, Function<Exception, X> mapper):根据传入ListenableFuture和Function构建一个CheckFuture,映射异常的实例到相应的检查类型。

 

immediateFuture(@Nullable V value):创建一个设置value值的ListenableFuture,其value值立即会被设置,getter方法只是返回值。这个 Future不能取消或超时,Future的isDone()方法总是返回true。

 

immediateFailedFuture( Throwable throwable):返回一个构造时设置传入异常的ListenableFuture,返回的Future不能被取消,isDone()方法总是返回 true,调用get()方法会抛出被ExecutionException包装的Throwable。

 

immediateCancelledFuture():创建一个会被立即取消的ListenableFuture,所以isCancelled()方法总是返回true。

 

immediateCheckedFuture(@Nullable V value):返回一个CheckedFuture,构造时其value值立即会被设置,返回的Future不能被取消,isDone()方法总是返回 true,调用get()或者checkGet()方法会立即返回设置的value值。

 

immediateFailedCheckedFuture(X exception):返回一个构造时设置传入异常的CheckedFuture,返回的Future不能被取消,isDone()方法总是返回 true,调用get()方法会抛出被ExecutionException包装的Exception,调用checkGet()方法会抛出给定的 exception异常。

 

withFallback( ListenableFuture<? extends V> input, FutureFallback<? extends V> fallback):返回一个Future,其结果来自于ListenableFuture,如果ListenableFuture出现失败,则结果由给 定的FutureFallback产生。

 

withFallback( ListenableFuture<? extends V> input, FutureFallback<? extends V> fallback, Executor executor):返回一个Future,其结果来自于ListenableFuture,如果ListenableFuture出现失败,则结果由给 定的FutureFallback产生,并由给定的executor提供线程单独运行FutureFallback。

 

transform(ListenableFuture<I> input, AsyncFunction<? super I, ? extends O> function):创建一个新的ListenableFuture,它的结果异步来自于给定ListenableFuture的结果,更准确的说,返回 的结果是由原始的结果应用给定的function后的结果。

 

transform(ListenableFuture<I> input, AsyncFunction<? super I, ? extends O> function, Executor executor):创建一个新的ListenableFuture,它的结果异步来自于给定ListenableFuture的结果,更准确的说,返回 的结果是由原始的结果应用给定的function后的结果,给定的function操作由executor执行。

 

transform(ListenableFuture<I> input, final Function<? super I, ? extends O> function):创建一个新的ListenableFuture,它的结果是给定input ListenableFuture的结果应用给定的function后的结果。

 

transform(ListenableFuture<I> input, final Function<? super I, ? extends O> function, Executor executor):创建一个新的ListenableFuture,它的结果是给定input ListenableFuture的结果应用给定的function后的结果,给定的function操作由executor执行。

 

lazyTransform(final Future<I> input, final Function<? super I, ? extends O> function):与transform方法类似,不过function的转换过程会每次调用返回的Future的get()方法。

 

dereference( ListenableFuture<? extends ListenableFuture<? extends V>> nested):返回一个新的ListenableFuture,它的结果是给定nested ListenableFuture调用get()的结果, 此方法能够有效的将一个ListenableFuture链接到另一个ListenableFuture。

 

allAsList( ListenableFuture<? extends V>... futures):创建一个新的ListenableFuture,当给定的futures集合中future都完成时返回结果的list,如果任一 future失败,则创建的ListenableFuture会失败。

allAsList( Iterable<? extends ListenableFuture<? extends V>> futures):创建一个新的ListenableFuture,当给定的futures集合中future都完成时返回结果的list,如果任一 future失败,则创建的ListenableFuture会失败。

 

nonCancellationPropagating( ListenableFuture<V> future):创建一个新的ListenableFuture,当给定的future完成时,它的结果才会被设置。取消给定的future也会取消返回 的ListenableFuture,但是取消返回的ListenableFuture对给定的future没有影响。

 

successfulAsList( ListenableFuture<? extends V>... futures):创建一个新的ListenableFuture,它的值是一个列表包含所有传入Future集合中Future执行成功后返回的值,结 果的顺序与传入集合的顺序一致,如果任何一个传入集合中的Future失败或被取消,其对应的位置的值将会被设置为null,(这导致了将无法区别执行成 功后返回值为null的任务)。

 

successfulAsList( Iterable<? extends ListenableFuture<? extends V>> futures):创建一个新的ListenableFuture,它的值是一个列表包含所有传入Future集合中Future执行成功后返回的值,结 果的顺序与传入集合的顺序一致,如果任何一个传入集合中的Future失败或被取消,其对应的位置的值将会被设置为null,(这导致了将无法区别执行成 功后返回值为null的任务)。

 

inCompletionOrder( Iterable<? extends ListenableFuture<? extends T>> futures):返回一个委托的Future的列表,对应Future完成的顺序,委托的Future会返回相同的值或者抛出相同的异常,和原生的 Future一致。

 

addCallback(ListenableFuture<V> future, FutureCallback<? super V> callback):注册一个在任务成功或失败时运行的回调函数,一旦Future完成,则立即执行回调函数。

 

addCallback(final ListenableFuture<V> future, final FutureCallback<? super V> callback, Executor executor):注册一个在任务成功或失败时单独运行的回调函数,这个单独操作Callback的线程由传入的executor提供,一旦 Future完成,则立即执行回调函数。

 

get( Future<V> future, Class<X> exceptionClass):返回Future.get()的结果,转换大部分的异常为新给定的异常类型,这样减少了大量的代码,对异常代码不必要的区分类型。

 

get( Future<V> future, long timeout, TimeUnit unit, Class<X> exceptionClass):返回Future.get(long,TimeUnit)的结果,转换大部分的异常为新给定的异常类型,这样减少了大量 的代码,对异常代码不必要的区分类型。

 

getUnchecked(Future<V> future):返回Future.get()的结果,这个结果不会阻塞任务也不抛出被检查出的异常,这使得任务执行更轻量级,更快速运行,除非是遇到代码bug,否则不会失败。

 

    总结:Futures是强大的操作Future的工具类,不过其中的一些方法目前自己的理解还不清晰,其中的一些方法也没有用到,还需要在以后的工作和学习中,反复思考,反复总结。学无止境。

 

    代码地址:

转载于:https://my.oschina.net/realfighter/blog/350019

你可能感兴趣的文章
解读:Red Hat为什么收购Ansible
查看>>
Ossim下的安全合规管理
查看>>
DelphiWebMVC框架下BPL热部署实现
查看>>
C++与MySQL的冲突
查看>>
siki学习之观察者模式笔记
查看>>
单元测试
查看>>
spring.net 继承
查看>>
ES6:模块简单解释
查看>>
JavaScript indexOf() 方法
查看>>
用Bootstrap写一份简历
查看>>
ZJU PAT 1023
查看>>
WMI远程访问问题解决方法
查看>>
从零开始学习IOS,(UILabel控件)详细使用和特殊效果
查看>>
Android开发历程_15(AppWidget的使用)
查看>>
阿花宝宝 Java 笔记 之 初识java
查看>>
7、设计模式-创建型模式-建造者模式
查看>>
Cesium官方教程11--建模人员必读
查看>>
我国古代的勾股定理
查看>>
Linux下的C编程实战
查看>>
[32期] html中部分代码与英语单词关系
查看>>