hp rx8640

对我而言,使用Rx-java的最大好处之一是无论底层调用是同步还是异步,因此代码看起来都完全相同,因此该条目的标题也是如此。

考虑一个非常简单的客户端代码用例,它执行三个缓慢运行的调用并将结果合并到一个列表中:

String op1 = service1.operation();
String op2 = service2.operation();
String op3 = service3.operation();
Arrays.asList(op1, op2, op3)

由于呼叫是同步的,因此花费的时间会增加。 为了模拟慢速调用,以下是每个方法调用中的实现类型:

public String operation() {logger.info("Start: Executing slow task in Service 1");Util.delay(7000);logger.info("End: Executing slow task in Service 1");return "operation1"
}

因此,在这些实现中使用rx-java的第一个尝试是简单地让这些长时间运行的操作返回通用类型Observable ,一个糟糕的实现看起来像这样:

public Observable<string> operation() {logger.info("Start: Executing slow task in Service 1");Util.delay(7000);logger.info("End: Executing slow task in Service 1");return Observable.just("operation 1");
}

因此,调用方实现将更改为以下内容:

Observable<String> op1 = service1.operation();
Observable<String> op2 = service2.operation();
Observable<String> op3 = service3.operation();Observable<List<String>> lst = Observable.merge(op1, op2, op3).toList();

查看调用者如何使用merge方法组合结果。

但是,此时每个服务调用的调用仍然是同步的,为了使调用中断,可以通过以下方式使服务调用使用线程池:

public class Service1 {private static final Logger logger = LoggerFactory.getLogger(Service1.class);public Observable<String> operation() {return Observable.<String>create(s -> {logger.info("Start: Executing slow task in Service 1");Util.delay(7000);s.onNext("operation 1");logger.info("End: Executing slow task in Service 1");s.onCompleted();}).subscribeOn(Schedulers.computation());}
}

subscriptionOn使用指定的Scheduler来运行实际操作。

该方法的优点在于,该服务的调用代码根本没有更改,那里的实现与以前完全相同,而服务调用现在是异步的。 如果您有兴趣进一步探索这个样本,这里是一个GitHub库一起工作的例子。

翻译自: https://www.javacodegeeks.com/2015/02/async-abstractions-using-rx-java.html

hp rx8640

hp rx8640_使用rx-java的异步抽象相关推荐

  1. Rx Java 异步编程框架

    Rx Java 文章目录 Rx Java 名词定义 举个例子 基本概念 Backpressure Upstream, Downstream Objects in motion Assembly tim ...

  2. java jpa 异步编程_异步处理时的JPA

    java jpa 异步编程 几年前,在Java世界中,几乎显而易见的是,每个"企业"类项目都需要JPA与数据库进行通信. JPA是Joel Spolsky描述的" 泄漏抽 ...

  3. 在Java中异步编程,同事非要用rxJava,被我一顿吐槽!

    在Java中异步编程,不一定非要使用rxJava, Java本身的库中的CompletableFuture可以很好的应对大部分的场景. 这篇文章介绍 Java 8 的 CompletionStage ...

  4. java后台异步任务执行器TaskManager

    java后台异步任务执行器TaskManager 此方式基于MVC方式: 一,使用任务: 1 @Resource 2 private TaskManager taskManager; 3 4 publ ...

  5. java的面向抽象原则

    java的面向抽象原则 - 未使用抽象原则 圆面积的计算 Circle.javapublic class Circle {double r;Circle(double r){this.r = r;}p ...

  6. 简单学习Java中的抽象语法树(AST)

    概述 抽象语法树(AST)是一种数据结构,代表了一种编程语言的抽象语法.它通常在编译器中用来解析源代码和生成机器代码. 在Java中,AST通常由一个解析器创建,该解析器读取源代码并创建一个树状结构, ...

  7. Java依赖于抽象不依赖于具体,依赖倒置原则(Dependecy-Inversion Principle)

    依赖倒置原则(Dependence Inversion Principle,DIP)的原始定义: 高层模块不应该依赖底层模块,两者都应该依赖其抽象: 抽象不应该依赖细节: 细节应该依赖抽象. 抽象:即 ...

  8. java http异步调用_HttpClient的异步调用,你造吗?

    一.前言 HttpClient提供了两种I/O模型:经典的java阻塞I/O模型和基于Java NIO的异步非阻塞事件驱动I/O模型. Java中的阻塞I/O是一种高效.便捷的I/O模型,非常适合并发 ...

  9. java属性定义_在java中定义抽象属性

    抽象关键字通常应用于类和方法,以便将某些行为的实现委托给子类. Java不支持抽象属性,如果您试图将类属性标记为抽象,则会得到编译错误. 在本教程中,将介绍两种定义抽象属性的方法,这些属性由子类设置, ...

最新文章

  1. Calico 的网络结构是什么?- 每天5分钟玩转 Docker 容器技术(68)
  2. android开发学习 ------- MongoDB数据库简单理解
  3. 写给那些正奔三的80后[转]
  4. 杭电多校(三)2019.7.29--暑假集训
  5. 单例模式之懒汉式/饿汉式/结合二者之优的模式
  6. 移动计算机怎么开机密码,win7忘记开机密码解决办法
  7. Python实现web动态服务器
  8. artTemplate -- 性能卓越的 js 模板引擎
  9. [No0000CE]检测非空格字符作为密码的密码强度
  10. HeadFirstJava
  11. ipad蓝牙键盘使用技巧_iPad提示,技巧和教程的完整列表
  12. 河南省第八届ACM程序设计竞赛(未完再续)
  13. 大学毕业4年-回顾和总结(9)-股权投资1年,给自己一个答卷(好狗狗、皇包车、职业梦、比呀比、易途8)(创业有风险,投资需谨慎)
  14. 微型计算机软件系统分为什么,微型计算机软件微型计算机软件主要包括哪些软件?...
  15. (转)大数据量分页存储过程效率测试附代码
  16. spreadsheetControl
  17. 罗生门:动荡时代下人性的恶与善
  18. dtree做权限控制
  19. TCGA官网下载和TCGAbiolinks下载的文件数量竟然不一样?
  20. 上海 集体户口转个人户口

热门文章

  1. 百度地图获取行政范围边界-区县级及以上范围
  2. Pandas个人最强笔记
  3. 少儿全学科知识学习、复习、训练的免费福利,少儿知识训练大师 5.0 全新发布:真人语音、插件题库、全新功能
  4. Angular 14微前端项目构建
  5. 动态流星雨制作代码分享(可直接复制)
  6. 使用js实现动态小球气泡背景
  7. mtk平台功率限制介绍
  8. 电脑桌面里的计算机里的软件是啥,屏幕尺子有哪些?电脑屏幕尺子软件推荐
  9. stricmp和_stricmp
  10. 学历造假!AI公司CEO冒充中科大少年班校友!清华、斯坦福名校经历全造假