使用guava的ListenableFuture可以帮我们检测Future是否完成了,如果完成就会自动调用回调函数,这样可以减少并发程序的复杂度。...ListenableFuture是可以监听的Future,它是对Java原生的Future进行了拓展和增强。...使用ListenableFuture Guava帮我们检测Future是否完成了,如果完成就自动调用回调函数,这样可以减少并发程序的复杂度。...com.google.common.util.concurrent; ListenableFuture 通过ListenableFuture的addListener方法 ListenableFuture...添加回调函数 在调用回调函数之前,首先需要实例化ListenableFuture实例对象。
接着我们就分析一下并发编程和使用guava的ListenableFuture实现高效编程。...优秀的ListenableFuture 在上述代码中我们分析了单线程和多线程对查询的性能对比,可以明显发现多线程的优势所在。...ListenableFuture是guava中提供的对多线程的比较优秀的支持,ListenableFuture顾名思义就是可以监听的Future,它是对java原生Future的扩展增强。...ListenableFuture是一个接口,它从jdk的Future接口继承。...在日常开发中希望更多的使用guava的ListenableFuture替代jdk自带线程池的Future,能够带来更好的性能提升。
序 本文主要研究一下AsyncHttpClient的ListenableFuture ListenableFuture org/asynchttpclient/ListenableFuture.java...public interface ListenableFuture extends Future { /** * Terminate and if there is no exception...* @return this Future */ ListenableFuture addListener(Runnable listener, Executor exec);...CompletableFuture toCompletableFuture(); //...... } ListenableFuture继承了java.util.concurrent.Future...class CompletedFailure implements ListenableFuture { private final ExecutionException e
ListenableFuture 并发是一个难问题,但是通过强有力和简单的抽象,可以简化。为了使问题简化,Guava 使用了JDK 的ListenableFuture接口。...这里强烈推荐诸位使用ListenableFuture而不是Future。...原因有如下三点: 大多数的Future方法需要ListenableFuture 切换到ListenableFuture很容易 工具方法的提供者不需要提供Future以及ListenableFuture他们方法的变体...一个ListenableFuture可以让你注册一个回调函数,一旦计算完毕,就会执行它。或者,这个任务早已经执行完毕,那就立刻执行这个回调函数。...ListenableFuture增加了这一项简单的功能,就可以高效的支持到许多基础的Future无法支持的操作。
方法介绍: 方法描述transformAsync(ListenableFuture , AsyncFunction , Executor)返回一个新的ListenableFuture,它的结果是执行异步函数的返回...,函数入参是ListenableFuture的返回结果;transform(ListenableFuture , Function , Executor)返回一个新的ListenableFuture,它的结果是执行函数的返回...,函数入参是ListenableFuture的返回结果;allAsList(Iterable)返回一个ListenableFuture,它的结果是一个list,包含每一个列表中的ListenableFuture...的执行结果,任何一个ListenableFuture执行失败或者取消,最后的返回结果取消successfullAsList(Iterable)返回一个ListenableFuture,它的结果是一个list...,包含每一个列表中的ListenableFuture的执行结果,成功的是结果,失败或者取消的值使用null替代 AsyncFunction 提供了一个方法 , ListenableFuture
继承自Future的ListenableFuture,允许我们添加回调函数在线程运算完成时返回值或者方法执行完成立即返回。...listener, Executor executor); } ListenableFuture集成及JDK的Future。...3.Guava更多关于JDK线程的拓展 transform:对于ListenableFuture的返回值进行转换。...makeChecked: 将ListenableFuture 转换成CheckedFuture。CheckedFuture 是一个ListenableFuture 。...ListenableFuture的进行转换,返回一个新的ListenableFuture final ListenableFuture transform = Futures.
at org.elasticsearch.common.util.concurrent.ListenableFuture.notifyListener(ListenableFuture.java:92)...at org.elasticsearch.common.util.concurrent.ListenableFuture.notifyListener(ListenableFuture.java:92)...at org.elasticsearch.common.util.concurrent.ListenableFuture.notifyListener(ListenableFuture.java:92)...at org.elasticsearch.common.util.concurrent.ListenableFuture.notifyListener(ListenableFuture.java:92)...at org.elasticsearch.common.util.concurrent.ListenableFuture.notifyListener(ListenableFuture.java:92)
public static ListenableFuture> allAsList(ListenableFuture... futures) public static ListenableFuture...,就是组合的ListenableFuture实例的get()方法永远不会抛异常,即使之前某ListenableFuture实例对应的任务抛异常。...public static ListenableFuture> successfulAsList(ListenableFuture... futures) public static...ListenableFuture> successfulAsList(Iterable> futures) Futures.addCallback...ListenableFuture CompleteFuture 一个Future类是显示的完成,而且能被用作一个完成等级,通过它的完成触发支持的依赖函数和行为。
. */ ListenableFuture> sendDefault(V data); /** * Send the data to...* @return a Future for the {@link SendResult}. */ ListenableFuture> send...* @return a Future for the {@link SendResult}. */ ListenableFuture> send...* @return a Future for the {@link SendResult}. */ ListenableFuture> send...* @return a Future for the {@link SendResult}. */ ListenableFuture> send
ListenableFuture接口: public interface ListenableFuture extends Future { void addCallback(ListenableFutureCallback...AsyncResult类实现了ListenableFuture接口,也实现了它所有的方法。接下来,我们将分别介绍如何获取异步处理后的返回值和异常处理。...使用ListenableFuture接口 我们在AsyncService接口中添加一个方法:returnMsg(),并使用ListenableFuture接口来进行包装,代码如下: /** * 异步回调消息方法...* * @return 字符串 */ ListenableFuture returnMsg(); 实现类中的代码如下: @Override @Async public ListenableFuture...相比较而言,更加推荐使用ListenableFuture来进行有返回值的异步处理。
由于普通的线程池,返回的Future,功能比较单一;Guava 定义了 ListenableFuture接口并继承了JDK concurrent包下的Future 接口,ListenableFuture...countNum : list.size()))); ListenableFuture listenableFuture = executorService.submit(myCallable...); //回调函数 Futures.addCallback(listenableFuture, new FutureCallback<List<String
案例1:异步执行任务完毕之后回调 package com.itsoku.chat34; import com.google.common.util.concurrent.ListenableFuture...ListeningExecutorService的submit方法用来异步执行一个任务,返回ListenableFuture,ListenableFuture接口继承于juc中的Future接口,对Future...ListenableFuture的get方法会阻塞当前线程直到任务执行完毕。...extends ListenableFuture> futures) 传递一批ListenableFuture,返回一个ListenableFuture>,内部将一批结果转换为了一个ListenableFuture
与RateLimiter示例 概念 ListenableFuture顾名思义就是可以监听的Future,它是对Java原生Future...使用ListenableFuture Guava帮我们检测Future是否完成了,如果完成就自动调用回调函数,这样可以减少并发程序的复杂度。...另外ListenableFuture还有其他几种内置实现: SettableFuture:不需要实现一个方法来计算返回值,而只需要返回一个固定值来做为返回值,可以通过程序设置此Future的返回值或者异常信息...CheckedFuture: 这是一个继承自ListenableFuture接口,他提供了checkedGet()方法,此方法在Future执行发生异常时,可以抛出指定类型的异常。...//同步获取调用结果 try { System.out.println(listenableFuture.get()); }
ListenableFuture 接口,继承 Future 接口,有如下好处: 我们强烈地建议你在代码中多使用ListenableFuture来代替JDK的 Future, 因为: 大多数Futures...转到ListenableFuture 编程比较容易。 Guava提供的通用公共类封装了公共的操作方方法,不需要提供Future和ListenableFuture的扩展方法。...ListenableFuture可以允许你注册回调方法(callbacks),在运算(多线程执行)完成的时候进行调用, 或者在运算(多线程执行)完成后立即执行。...如上内容来自《Google Guava包的ListenableFuture解析 》,文章写的很棒。...下文你会看到 Sharding-JDBC 是如何通过 ListenableFuture 简化并发编程的。
于是笔者想结合目前了解到的Future实现原理的前提下扩展出支持(监听)回调的Future,思路上参考了Guava增强的ListenableFuture。...编码实现 先定义一个Future接口的子接口ListenableFuture,用于添加可监听的回调: public interface ListenableFuture extends Future...接口继承ExecutorService接口: public interface ListenableExecutorService extends ExecutorService { ListenableFuture... listenableSubmit(Callable callable); /** * 定义这个方法是因为有些时候由于任务执行时间非常短,有可能通过返回的ListenableFuture...*/ ListenableFuture listenableSubmit(Callable callable, List<ListenableFutureCallback
; } } 8、Guava异步 Guava的ListenableFuture顾名思义就是可以监听的Future,是对java原生Future的扩展增强。...使用「Guava ListenableFuture」可以帮我们检测Future是否完成了,不需要再通过get()方法苦苦等待异步的计算结果,如果完成就自动调用回调函数,这样可以减少并发程序的复杂度。...我们看下如何使用ListenableFuture。...(Executors.newCachedThreadPool()); final ListenableFuture listenableFuture = executorService.submit...ListenableFuture要做的工作,在Callable接口的实现类中定义,这里只是休眠了1秒钟然后返回一个数字1,有了ListenableFuture实例,可以执行此Future并执行Future
从接口声明上来看,AsyncRestTemplate 与 RestTemplate 的使用姿势没有什么区别,如典型的 GET/POST 接口声明如下 // GET @Override public ListenableFuture...url, Class responseType, Object... uriVariables) throws RestClientException @Override public ListenableFuture...> uriVariables) throws RestClientException @Override public ListenableFuture>..., Class responseType, Object... uriVariables) throws RestClientException @Override public ListenableFuture...> uriVariables) throws RestClientException @Override public ListenableFuture>
, Monitor> MONITORS = new ConcurrentHashMap(); private static final Map> FUTURES = new ConcurrentHashMap>(); private static final...this.key = key; } @Override public void run() { try { ListenableFuture... listenableFuture = AbstractMonitorFactory.FUTURES.get(key); AbstractMonitorFactory.MONITORS.put...(key, listenableFuture.get()); AbstractMonitorFactory.FUTURES.remove(key);
KafkaTemplate 调用 send()方法实际上返回的是ListenableFuture 对象。...send()方法源码如下: @Override public ListenableFuture> send(String topic, @Nullable V data...ListenableFuture方法源码如下: public interface ListenableFuture extends Future { void addCallback...}); } 使用lambda表达式再继续优化: public void sendMessage(String topic, Object o) { ListenableFuture...我们使用send(String topic, @Nullable V data)方法的时候实际会new 一个ProducerRecord对象发送, @Override public ListenableFuture
领取专属 10元无门槛券
手把手带您无忧上云