Guava之ListenableFuture(链式回调)

2024-06-10 02:32

本文主要是介绍Guava之ListenableFuture(链式回调),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇文章,只是简单地介绍了用guava的ListenableFuture实现异步,那如果需要多重回调呢?

方法描述
transform加一个回调函数
allAsList返回一个ListenableFuture ,该ListenableFuture 返回的result是一个List,List中的值是每个ListenableFuture的返回值,假如传入的其中之一fails或者cancel,这个Future fails 或者canceled
successAsList返回一个ListenableFuture ,该Future的结果包含所有成功的Future,按照原来的顺序,当其中之一Failed或者cancel,则用null替代

链式回调:

package cn.dubby.listeningfuture;import com.google.common.util.concurrent.*;import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;/*** Created by dubby on 16/4/29.*/
public class ListeningFutureDemo {public static void main(String[] args) {final CountDownLatch latch = new CountDownLatch(1);final ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));ListenableFuture<String> explosion = service.submit(new Callable<String>() {public String call() throws Exception {System.out.println("任务线程正在执行...");try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}return "任务线程的结果";}});ListenableFuture<String> first = Futures.transform(explosion, new AsyncFunction<String, String>() {public ListenableFuture<String> apply(final String input) throws Exception {ListenableFuture<String> temp = service.submit(new Callable<String>() {public String call() throws Exception {System.out.println("第1个回调线程正在执行...");try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}return input + " & 第1个回调线程的结果 ";}});return temp;}}, service);ListenableFuture<String> second = Futures.transform(first, new AsyncFunction<String, String>() {public ListenableFuture<String> apply(final String input) throws Exception {ListenableFuture<String> temp = service.submit(new Callable<String>() {public String call() throws Exception {System.out.println("第2个回调线程正在执行...");try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}return input + " & 第2个回调线程的结果 ";}});return temp;}}, service);ListenableFuture<String> third = Futures.transform(second, new AsyncFunction<String, String>() {public ListenableFuture<String> apply(final String input) throws Exception {ListenableFuture<String> temp = service.submit(new Callable<String>() {public String call() throws Exception {System.out.println("第3个回调线程正在执行...");try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}return input + " & 第3个回调线程的结果 ";}});return temp;}}, service);ListenableFuture<String> forth = Futures.transform(third, new AsyncFunction<String, String>() {public ListenableFuture<String> apply(final String input) throws Exception {ListenableFuture<String> temp = service.submit(new Callable<String>() {public String call() throws Exception {System.out.println("第4个回调线程正在执行...");try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}return input + " & 第4个回调线程的结果 ";}});return temp;}}, service);Futures.addCallback(forth, new FutureCallback<String>() {public void onSuccess(String result) {latch.countDown();System.out.println("结果: " + result);}public void onFailure(Throwable t) {System.out.println(t.getMessage());}});try {latch.await();} catch (InterruptedException e) {e.printStackTrace();}service.shutdown();}}

一个Future,一共进行了两次处理,同样的,可以添加更多的回调函数。简化了操作。

这篇关于Guava之ListenableFuture(链式回调)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046984

相关文章

Java后端微服务架构下的API限流策略:Guava RateLimiter

Java后端微服务架构下的API限流策略:Guava RateLimiter 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在微服务架构中,API限流是保护服务不受过度使用和拒绝服务攻击的重要手段。Guava RateLimiter是Google开源的Java库中的一个组件,提供了简单易用的限流功能。 API限流概述 API限流通过控制请求的速率来防止

关于回调函数和钩子函数基础知识的整理

回调函数:Callback Function 什么是回调函数? 首先做一个形象的比喻:   你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机

Ajax 解决回调竞争

回调的竞争,即多次快速点击同一按钮导致多个异步的AJAX请求同时返回,导致数据更新顺序混乱。这种情况在异步编程中很常见,特别是前端开发时,AJAX请求的回调并不保证按顺序执行。 $.ajaxSetup() 可以设置全局的 beforeSend 和 complete 回调函数,这样每个 AJAX 请求在发送前和完成后都可以执行相应的逻辑。 let isRequestPending = false

[数据结构]栈之链式栈的类模板实现

栈的抽象基类的实现:(不用抽象基类也是可以的,为了使用虚函数方便) #ifndef STACK#define STACK//栈的抽象基类template<class T>class Stack{public:Stack(){}~Stack(){}virtual void Push(const T& x)=0;virtual bool Pop(T& x)=0;virtual b

Java中将函数作为参数传入方法并回调

用于记录,方便后面cv 定义方法类 import java.util.Timer;import java.util.TimerTask;import java.util.function.Function;public class Utils {public static void reqData(String url, String param,Function<String,St

链式栈、队列

1、链式栈: 声明: #ifndef _STACK_H#define _STACK_H#include<stdlib.h>typedef int DataType;typedef struct snode //节点{DataType data;struct snode *pnext;}SNode_t;typedef struct stack //链表 {SNode_t

嵌入式学习(链式栈和链式队列)

栈(stack)是一种只能在一端插入或删除操作的线性表。 栈只能在表尾插入或删除元素,表尾就是栈的栈顶,表头就是栈底 栈的主要特点:LIFO(last in first out) "后进先出" 栈可以采用顺序存储结构(顺序栈) 和   链式存储结构(链式栈) 链式栈适用于以下场景: 动态数据场景:适用于无法预估数据量,或数据量变化频繁的场景。嵌套操作:如括号匹配、递归求解、函数调用等栈操

谈谈经典限流方法—漏桶、令牌桶与Guava RateLimiter的实现

大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 高并发的业务系统经常要接受大流量的考验,为了保证系统的响应度和稳定性,往往都需要对有风险的接口实施限流(rate limiting),更高大上的说法则是“流量整形”(traffic shaping)。限流的思想最初来源于计算机网络,有两种经典的方法:漏桶和令牌桶。本文先来稍微研究一下它们。

经典限流方法——漏桶、令牌桶与Guava RateLimiter的实现

点击上方蓝色字体,选择“设为星标” 回复”资源“获取更多资源 大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 高并发的业务系统经常要接受大流量的考验,为了保证系统的响应度和稳定性,往往都需要对有风险的接口实施限流(rate limiting),更高大上的说法则是“流量整形”(traffic shaping)。限流的思想最初来源于计算机

【C++学习(28)】通俗一点讲解:std::bind 回调技术

std::bind 是 C++11 标准库中的一个功能,它允许你“绑定”某些参数到一个函数、成员函数或可调用对象上,从而生成一个新的可调用对象。这种新的可调用对象可以稍后被调用,而且其中一些参数已经被预先设置好了。这在回调函数和异步编程中特别有用。 下面我用一个通俗的例子来解释 std::bind 是如何工作的。 假设场景 假设你有一个家庭厨师,他有一个技能叫做“做饭”。做饭需要两个参数:一