你可能从来没有听说过Java9的这个基本功能。将于2017年7月发布的Java9将增加和修改许多功能和特性。在搜索JDK增强建议(JEP)时,我发现JEP266对CompletableFuture进行了一些有趣的改进,更新了并发功能并支持ReactiveStreams。本文重点介绍JEP266的改进和有趣的特性,它很可能会成为Java9中使用最多的特性之一。JEP266改进计划JEP266是Oracle的JDK增强协议草案的成员,它使很多更新并发。根据提案,将更新的特性有:支持ReactiveStreams发布-订阅框架接口更新CompletableFutureAPI,例如支持延迟、超时、子类化等方法其他常规改进,例如小调整和javadoc规范重写重点关注前两个改进。首先,Java9将支持ReactiveStreams,这是Java社区的一项改进计划,旨在改进开发人员的并发工作流。第二个是CompletableFutureAPI提供的几个固定器上层,允许开发人员返回到Future。Flow类ReactiveStreams发布-订阅框架将嵌套一个Flow类和一个SubmissionPublisher,开发人员可以使用它们来创建自定义组件。从上往下看,ReactiveStreams主要是解决背压问题。当传入任务速率大于系统处理能力时,数据处理会为未处理的数据生成缓冲区。同时,我们还与Akka团队的高级开发人员、ReactiveStreams项目负责人KonradMalawski进行了交流,讲解了ReactiveStreams的重要性以及如何使用。甲骨文指出,新的增强功能将包括“一个小接口,其定义符合广泛参与(来自ReactiveStream计划)”,这就是Flow类的来源。ReactiveStreams由4个Java接口组成:ProcessorPublisherPublisherSubscriberSubscriptionFlow类允许相互关联的接口和静态方法来构建流量控制组件,其中发布者由一个或多个订阅者消费的项目生成,每个订阅者由一个订阅管理。ReactiveStreams构建在java.util.concurrent.Flow容器对象下,开发者可以在其中找到Flow.Publisher,这是一个函数式接口,用作lambda表达式或方法引用的赋值目标。此接口使开发人员更容易生成Flow.Subscription元素并将它们链接在一起。另一个元素Flow.Subscriber,是一种由请求触发的异步工作机制。它可以向Flow.Subscription请求多个元素,开发者也可以根据需要自定义缓冲区大小。这些接口适用于并发和分布式异步设置,它们之间的通信依赖于一种简单的流量控制形式,可以用来避免资源管理问题。感兴趣的用户可以查看java.util.concurrent.Flow下的代码示例。已经有一些第三方库实现了ReactiveStreams接口,你不必等到Java9发布就可以试用。CompletableFuture新特性Java8引入了CompletableFuture,它继承自Future。Futures非常有用,当我们不想或者不需要一个直接的计算结果时,我们会收到一个Future对象来保存计算完成时分配的实际结果。显式完成是通过调用complete()方法完成的,无需异步等待。它还允许在一系列操作中构建管道数据流。这样,即使计算未完成,任何类型的可用值都可以在具有默认返回值的Future中使用。这也将是CompletableFuture提议更新的一部分,包括延迟和超时、更好地支持子类化以及一些实用方法。更多CompletableFuture功能改进和建议,可以到这里查看。总结Java9即将带来一些重大更新和改进,其中JEP266将是改进中最有趣的部分。它的改进主要来自旨在帮助开发人员解决异步处理的一些最大问题的社区倡议。