ListenableFuture是可以监听的Future,它是对Java原生的Future进行了拓展和增强。...com.google.common.util.concurrent; ListenableFuture 通过ListenableFuture的addListener方法 ListenableFuture...}, executorService); } } 执行结果: call execute.. get listenable future's result 7 通过Futures的静态方法addCallback...给ListenableFuture添加回调函数 在调用回调函数之前,首先需要实例化ListenableFuture实例对象。...System.out.println("任务执行失败"); } }; // 绑定任务以及回调函数 Futures.addCallback
接着我们就分析一下并发编程和使用guava的ListenableFuture实现高效编程。...优秀的ListenableFuture 在上述代码中我们分析了单线程和多线程对查询的性能对比,可以明显发现多线程的优势所在。...ListenableFuture是guava中提供的对多线程的比较优秀的支持,ListenableFuture顾名思义就是可以监听的Future,它是对java原生Future的扩展增强。...ListenableFuture是一个接口,它从jdk的Future接口继承。...>() { @Override public User call() throws Exception { return mockOutService(u); } }); Futures.addCallback
过程 代码: Futures.addCallback(futureTask, callback); Futures.addCallback(futureTask,callback,executorService...public static void addCallback( ListenableFuture future, FutureCallbackaddCallback(futureTask, callback);方法描述 ?...如果回调很慢或很重,请考虑#addCallback(ListenableFuture, FutureCallback, Executor) 为什么回调很慢要考虑带Executor对象的呢?...当回调快速且轻量级时,请考虑#addCallback(ListenableFuture, FutureCallback); 首先解释下什么是所谓的轻量级,什么是所谓的重!
ListenableFuture 并发是一个难问题,但是通过强有力和简单的抽象,可以简化。为了使问题简化,Guava 使用了JDK 的ListenableFuture接口。...这里强烈推荐诸位使用ListenableFuture而不是Future。...原因有如下三点: 大多数的Future方法需要ListenableFuture 切换到ListenableFuture很容易 工具方法的提供者不需要提供Future以及ListenableFuture他们方法的变体...增加回调函数 大多数的程序员倾向于使用Futures.addCallback(ListenableFuture, FutureCallback, Executor),或者是默认使用MoreExecutors.directExecutor...Callable() { public Explosion call() { return pushBigRedButton(); } }); Futures.addCallback
KafkaTemplate 调用 send()方法实际上返回的是ListenableFuture 对象。...ListenableFuture方法源码如下: public interface ListenableFuture extends Future { void addCallback...super T> var1); void addCallback(SuccessCallback> future = kafkaTemplate.send(topic, o); future.addCallback(result...> future = kafkaTemplate.send(producerRecord); future.addCallback(
编码实现 先定义一个Future接口的子接口ListenableFuture,用于添加可监听的回调: public interface ListenableFuture extends Future... { void addCallback(ListenableFutureCallback callback, Executor executor); } ListenableFutureCallback...callbackRunnable.run(); } } } @Override public void addCallback...; for (ListenableFutureCallback callback : callbacks) { listenableFutureTask.addCallback...Thread.sleep(1000); throw new RuntimeException("exception"); }); future.addCallback
序 本文主要研究一下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
增加回调 很多用户喜欢使用 Futures.addCallback(ListenableFuture,FutureCallback,Executor)方法。...e.printStackTrace(); } return new AResult(30, "male", 1); }); Futures.addCallback...,函数入参是ListenableFuture的返回结果;transform(ListenableFuture , Function , Executor)返回一个新的ListenableFuture,它的结果是执行函数的返回...,函数入参是ListenableFuture的返回结果;allAsList(Iterable)返回一个ListenableFuture,它的结果是一个list,包含每一个列表中的ListenableFuture...= Futures.successfulAsList(querys); Futures.addCallback(successfulAsList, new FutureCallback
> uriVariables) throws RestClientException @Override public ListenableFuture>...> uriVariables) throws RestClientException @Override public ListenableFuture>...name=一灰灰&age=20", String.class); response.addCallback(new ListenableFutureCallback<ResponseEntity<String...name=一灰灰&age=20", String.class); response.addCallback(new ListenableFutureCallback<ResponseEntity<String...age=19", String.class); } }); // 完成之后,在指定的线程池(第三个参数)中回调 Futures.addCallback
log.info("{}", System.currentTimeMillis()); return 10; }); Futures.addCallback...Demo2 - 10 14:26:11.945 [pool-1-thread-1] INFO com.itsoku.chat34.Demo2 - 执行成功:10 上面通过调用Futures的静态方法addCallback...extends ListenableFuture> futures) 传递一批ListenableFuture,返回一个ListenableFuture>,内部将一批结果转换为了一个ListenableFuture...> listListenableFuture = Futures.allAsList(futureList); Futures.addCallback
ListenableFuture接口: public interface ListenableFuture extends Future { void addCallback(ListenableFutureCallback...super T> callback); void addCallback(SuccessCallback completable() { CompletableFuture completable = new DelegatingCompletableFuture(this); addCallback...使用ListenableFuture接口 我们在AsyncService接口中添加一个方法:returnMsg(),并使用ListenableFuture接口来进行包装,代码如下: /** * 异步回调消息方法... result = asyncService.returnMsg(); result.addCallback(new SuccessCallback() {
5s Thread.sleep(5000); return true; }); // 注册回调事件 Futures.addCallback...3.Guava更多关于JDK线程的拓展 transform:对于ListenableFuture的返回值进行转换。...makeChecked: 将ListenableFuture 转换成CheckedFuture。CheckedFuture 是一个ListenableFuture 。...ListenableFuture的进行转换,返回一个新的ListenableFuture final ListenableFuture transform = Futures....", input.size())); } }, listeningExecutorService); // 注册回调事件 Futures.addCallback
void addCallback(SuccessCallbackListenableFuture 定义的 #addCallback(...)...super V> callback) { addCallback(callback, callback); } @Override public void addCallback(SuccessCallback...ListenableFutureTask 对 ListenableFuture 定义的 #addCallback(...)...super T> callback) { this.callbacks.addCallback(callback); } @Override public void addCallback(SuccessCallback
param topic topic * @param t 消息 * @param 消息类型 * @return 发送结果 */ public ListenableFuture...@param key key * @param t 消息 * @param 消息类型 * @return 发送结果 */ public ListenableFuture...">>>>> Kafka消息发送,topic: {}, Key: {}, message: {}", TOPIC_NAME, TOPIC_NAME, warningMessage); ListenableFuture...String>> future = kafkaCommonProducer.send(TOPIC_NAME, TOPIC_NAME, warningMessage); future.addCallback
} 这条消息会被发送到名为 topic.quick.default 的主题当中去. kafkaTemplate.send 方法的使用 我们要注意 kafkaTemplate.send 它的返回值是ListenableFuture...,从名字我们就能知道它实际上是一个异步的方法, 我们可以通过 ListenableFuture.addCallback 方法去指定回调函数: @Scheduled(cron = "*/15 * *...public void send() { ListenableFuture> send = kafkaTemplate.send("...xxxxx", "test"); send.addCallback(new ListenableFutureCallback(){ @Override...public void onFailure(Throwable throwable) { } }); } 我们也可以通过 ListenableFuture.get
由于普通的线程池,返回的Future,功能比较单一;Guava 定义了 ListenableFuture接口并继承了JDK concurrent包下的Future 接口,ListenableFuture...countNum : list.size()))); ListenableFuture listenableFuture = executorService.submit(myCallable...); //回调函数 Futures.addCallback(listenableFuture, new FutureCallback<List<String
future = queryAssignment(topic); Futures.addCallback(future, new FutureCallback...future = consumer.receiveMessage(request, mq, longPollingTimeout); Futures.addCallback... future = executorService.submit(task); Futures.addCallback(future, new FutureCallback... future = consume(messageView); Futures.addCallback(future, new FutureCallback... future0 = consume(messageView); ListenableFuture future = Futures.transformAsync
ListenableFuture是guava包里面的,对Future进行了增强,ListenableFuture继承了Future,新增了一个添加回调的方法 /** * @param listener...public static void addCallback( ListenableFuture future, FutureCallback callback) { // 这里使用了DirectExecutor线程池,即直接在当前线程执行 addCallback(future, callback..., directExecutor()); } // Futures#addCallback public static void addCallback(final ListenableFuture...ListenableFutureTask 其实Spring里面也有一个ListenableFutureTask,实现上和guava大同小异,也是继承了FutureTask并且实现了自己的ListenableFuture
领取专属 10元无门槛券
手把手带您无忧上云