发布时间:2023-02-19 文章分类:编程知识 投稿人:李佳 字号: 默认 | | 超大 打印

读Java实战(第二版)笔记14_CompletableFuture及反应式编程背后的概念

1.潮流

1.1.与应用程序运行的硬件平台相关

1.1.1.编写能充分利用多核处理器能力的软件

1.2.与应用程序的结构相关

1.2.1.反映了互联网应用对可用性日益增长的需求

2.聚合型应用(mashup)

2.1.使用来自多个数据源的内容,将它们聚集在一起,从而简化我们的生活

3.并发

3.1.一种编程属性(重叠地执行)

3.2.在单核的机器上可以执行

4.并行

4.1.执行硬件的属性(同时执行)

5.为支持并发不断演进

5.1.提供了锁(通过synchronized类和方法)、Runnable以及线程

5.2.Java 5又引入了java.util.concurrent包

5.3.Java 7为了使用fork/join实现分而治之算法,新增了java.util.concurrent.RecursiveTask

5.4.Java 8则增加了对流和流的并行处理(依赖于新增的Lambda表达式)的支持

5.5.Java 9提供了对分布式异步编程的显式支持

5.6.Java 9通过“发布-订阅”协议增加了对反应式编程的支持

6.线程以及更高层的抽象

6.1.对并行流的迭代是比显式使用线程更高级的概念

6.2.使用流(Stream)是对一种线程使用模式的抽象

6.3.执行器和线程池

6.3.1.Java 5提供了执行器框架,其思想类似于一个高层的线程池,可以充分发挥线程的能力

6.3.2.能以很低的成本向线程池提交上千个任务,同时保证硬件匹配的任务执行

6.4.使用线程池都比直接操纵线程要好

6.4.1.使用k个线程的线程池只能并发地执行k个任务

6.4.2.超限的任务会被加入等待队列,直到现有任务执行完毕才会重新调度空闲线程去执行新任务

6.5.严格fork/join

6.5.1.线程创建以及与其匹配的join()在调用返回的嵌套方法调用中都以嵌套的方式成对出现

6.5.2.无论什么时候,任何任务(或者线程)在方法调用中启动时,都会在其返回之前调用同一个方法

6.6.非嵌套方法调用

7.同步及异步API

7.1.同步API变为异步API

7.1.1.方法不再在物理返回其调用者的同时返回它的执行结果

7.1.2.被调用函数可以在返回结果就绪之前物理上提前返回调用函数

7.1.3.方法异步化(在完成它们的工作之前返回)能提升程序的并发度,其可以与用于循环结构的优化进行互补

7.2.Future风格的API

7.2.1.使用Java Future的改进版本

7.3.反应式风格的API

7.3.1.使用Java 9 java.util.concurrent.Flow接口的反应式编程风格

7.4.有害的睡眠及其他阻塞式操作

7.4.1.线程池中的任务即便是处于睡眠状态,也会阻塞其他任务的执行

7.4.2.它们无法停止已经分配了线程的任务,因为这些任务的调度是由操作系统管理的

8.“线框-管道”模型

8.1.box-and-channel

8.2.可以对异步系统进行可视化

8.3.设计和理解并发系统最好的方式是使用图形

9.反应式系统

9.1.一个程序,其架构很灵活,可以在运行时调整以适应变化的需求

9.2.响应性

9.2.1.不能因为正在替某人处理一个大型任务就延迟其他用户的查询请求,它必须实时地对输入进行响应

9.3.韧性

9.3.1.不能因为某个组件失效就无法提供服务

9.4.弹性

9.4.1.系统可以调整以适应工作负荷的变化,持续高效地运行

9.5.消息驱动

9.5.1.基于线框-管道模型提供了内部API,组件等待要处理的输入,处理结果通过消息发送给其他的组件

10.Future和CompletableFuture

10.1.思维模式是计算的执行是独立且并发的

10.2.Future是一个一次性对象,它只能从头到尾执行代码一次

11.反应式编程

11.1.思维模式是类Future的对象随着时间的推移可以产生很多的结果

12.发布-订阅”的模型

12.1.pub-sub

12.2.订阅者可以订阅的发布者

12.3.名为订阅的连接

12.4.消息(也叫事件),它们通过连接传输

12.5.数据的流动是从发布者(生产者)流向订阅者(消费者)

12.5.1.向上流(upstream)

12.5.2.向下流(downstream)

12.6.提供了对onError和onComplete方法的支持

12.6.1.比传统的观察者模式更加强大

12.7.背压

12.7.1.流量控制

12.8.压力