# Java 响应式编程【Reactive Programming in Java】

学习来源:Exploring reactive programming in Java by Miro Cupak

最近学习RxJava。RxJava 在 GitHub 主页上的自我介绍:

RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.

翻译:RxJava是Reactive Extensions(响应式扩展)在 Java VM 上的实现,是一个使用可观测的序列来组成异步的、基于事件的程序的库。

两个关键词:Reactive Extensionsasynchronous

RxJava 的核心是响应式编程,所解决的问题是“异步”

所以在学习Rx库之前,有必要了解下什么是响应式编程


RX

Reactive Extensions是指什么。

Rx取自于ReactiveX,ReactiveX是Reactive Extensions的缩写。RxJava是ReactiveX在Java端的一种实现。所以还有RxJs,Rx.Net,RxSwift等多种实现。

官网对其的介绍如下:

An API for asynchronous programming with observable streams

一个带有可观察的流的异步编程的API

还是离不开“异步”,提到异步就不得不提到线程

所以,线程是响应式编程的第一步!


响应式的由来

故事从上古时期说起:

Java 1:

众所周知,Java在设计之初就是一门支持多线程的语言。在Java1.0版本中,要想开辟一个新线程,需使用Thread:

Thread thread = new Thread(() -> System.out.println("hello world"));
thread.start()

除此之外,它几乎不能做任何复杂的事情。

你可以说它有异步,但是他的整个异步系统处于“瘫痪”状态,简陋至极。当然也没有“响应”可言,可以叫他“零响应式”。

Java 5:

这个版本中为我们新增了三个很实用的接口:ExcutorService、Future和Callable。

Callable使Runnable有了返回值;ExecutorService.submit(callable)方法返回一个Future<T>,便可以从Future中获取异步执行返回的结果。

ExecutorService e = Executors.newSingleThreadExecutor();
Future<String> future = e.submit(() -> "hello world");
future.get();

这样一来,我们有能力提供一个复杂的“异步”系统,但是“被动”且“低廉”。不管怎么说,它有了自己的一个异步系统,我们姑且称之为“一级响应式”。

Java 7

Java 7开始引入了一种新的Fork/Join线程池(Pool),它可以执行一种特殊的任务:把一个大任务拆成多个小任务并行执行。

同样的代码可以如下执行:

ExecutorService e = ForkJoinPool.commonPool();
Future<String> future = e.submit(() -> "hello world");
future.get();

在此支持下,我们可以很好的做到各个线程的同步。我们称之为“二级响应式”。

但是饶是如此,使用Future获得异步执行结果时,要么调用阻塞方法get(),要么轮询看isDone()是否为true,主线程会被迫等待。

Java 8

从Java 8开始引入了CompletableFuture,它针对Future做了改进,可以传入回调对象,当异步任务完成或者发生异常时,自动调用回调对象的回调方法

CompletableFuture cf = new CompletableFuture<String>();
//cf.complete("hello");
cf.completeExceptionally(new Exception("error"));
cf.get();

等待、成功、异常,都可以作为方法传给CompletableFuture。

CompletableFuture中还内置很多方法,分为三类;

  1. What kind of task is this;
  2. What kind of an Opreation is it support;
  3. What thread should run for the task.

其中,task可以是runnable、consumer或者function。 3种。

Opretion可以是Chain(链接操作)、compose(组合)、combine AND( AND结合)、combine OR(OR结合)。4种。

thread可以是:当前线程、主线程 和 自己定义的某线程。3种。

一番排列组合下来,一共有3 × 4 × 3 = 36 种方法。

高效,漂亮,易使用,非阻塞。可以是“三级响应式”了

后续版本种还加入了延时方法,completeOnTimeOut()和orTime(),已经做到了很好的异步操作。

Java 9

到此为止这个异步系统还差点什么。比如当出线“生产者”比“消费者”快的情况下【背压问题】,不能很好的解决。

所以,Java 9 引入了Flow接口。

SimpleSubscriber sub = new SimpleSubscriber();
SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
publisher.subscribe(sub);

publisher.submit("msg");
publisher.close();

这一套接口使用下来,越发接近我们想要的模型了,是“四级响应式

但是它并不完美,因为一般异步都涉及到网络请求。

Java 9 到 Java 11

这其中新增了Http2接口,除了支持webSocket外,还对Flow进行了很好的适配,使得网络的响应更加容易了。至此我们称之为“五级响应式”

这些在API的种种变化,使得我们操作异步更加方便优雅,响应式的程度也就越高。

不过这些改变都在JDK的层面上。

Reactive Libraries

在往上走就是Library层面的故事了。我们的RxJava库,就属于这个层面。

框架

Library往上走就是框架层面,框架中也有响应的支持。

综上,最后结论如图:

image-20201205010159396.png

响应式编程使得我们操作异步更加方便。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容