1.阻塞式I/O1.1.一种通用且易于理解的方式,因为和程序用户的交互通常符合这样一种顺序执行的方式1.2.将系统扩展至支持大量用户时,需要和服务器建立大量TCP连接,因此扩展性不是很好2.非阻塞式I/O2.1.异步I/O2.2.可以处理大量并发网络连接,而且一个线程可以为多个连接服务2.3.适用场景2.3.1.业务逻辑本身就使用事件来描述2.3.1.1.Twitter2.3.1.2.图形化展示股票价格2.3.2.应用需要同时处理大量I/O操作2.3.2.1.阻塞式I/O需要同时使用大量线程,这会导致大量锁之间的竞争和太多的上下文切换3.消息传递架构3.1.Vert.x3.1.1.没有限制只能使用字符串传递消息3.1.2.可以使用更复杂的JSON对3.1.3.使用Buffer类构建自己的消息3.2.确保消息不会共享状态是最重要的3.2.1.不可变消息是最简单的解决方式3.2.2.通过复制消息也能解决该问题4.末日金字塔问题4.1.使用with方法4.1.1.不再是一个方法只能有一个功能,我们将一个功能分散在了多个方法里4.2.不使用try-with-resources的方式5.Future5.1.方法不是返回一个值,而是返回一个Future对象,该对象第一次创建时没有值,但以后能拿它“换回”一个值6.CompletableFuture6.1.延迟对象或约定6.2.从单一的返回值推广到数据流6.2.1.来处理一个值6.2.2.可以组合不同的实例,而不用担心末日金字塔问题6.2.3.注册Lambda表达式,并且把高阶函数链接起来6.2.4.结合了Future对象打欠条的主意和使用回调处理事件驱动的任务6.3.如果你想在链的末端执行一些代码而不返回任何值,比如Consumer和Runnable,就thenAccept和thenRun方法6.4.可使用thenApply方法转换CompletableFuture对象的值,有点像使用Stream的map方法6.5.在CompletableFuture对象出现异常时,可使用exceptionally方法恢复,可以将一个函数注册到该方法,返回一个替代值6.6.如果你想有一个map,包含异常情况和正常情况,请使用handle方法6.7.要找出CompletableFuture对象到底出了什么问题,可使用isDone和isCompleted-Exceptionally方法辅助调查6.8.常用情境是异步执行一段代码,该段代码计算并返回一个值7.响应式编程7.1.一种声明式编程方法,它让程序员以自动流动的变化和数据流来编程7.2.RxJava7.2.1.为了组合异步和基于事件的系统流程而设计的7.2.2.处理一组值7.3.使用基于Lambda表达式的回调,很容易实现事件驱动架构8.Stream是为构建内存中集合的计算流程而设计的