Java 9的这一基本功能,你可能从未听过

2017年7月即将发布的Java 9将会新增和修订不少功能和特性。在搜索JDK增强提议(JEP)时发现,JEP 266对CompletableFuture进行了一些有趣的改进,更新并发功能和支持Reactive Streams。

本文的焦点就是JEP 266的改进和一些有趣的特性,它极有可能成为Java 9中最常用的特性之一。

JEP 266改进计划
JEP 266是Oracle草拟JDK增强协议里面的一员,其中对并发进行了大量的更新。根据提案,将要进行更新的特性有:

  • 支持Reactive Streams发布-订阅框架接口
  • 对CompletableFuture API进行更新,例如支持延迟、超时、子类化和其它方法
  • 其它一般改进,例如小调整和javadoc规范重写

本文重点关注前两个改进。首先,Java 9将支持Reactive
Streams,这是一个来自Java社区的改进计划,旨在改进开发人员的并发工作流程。其次是CompletableFuture
API提供的几个fixer-uppers,可以让开发人员回到Future<T>。

Flow类
Reactive Streams发布-订阅框架里面将嵌套一个Flow类,以及开发人员可以用来创建自定义组件使用的SubmissionPublisher。

先从最上面的说起,Reactive Streams主要解决背压(back-pressure)问题。当传入的任务速率大于系统处理能力时,数据处理将会对未处理数据产生一个缓冲区。

与此同时,我们还与Akka团队的高级开发人员Konrad Malawski进行了沟通,他是Reactive Streams计划的领导者,解释了Reactive Streams的重要性以及如何使用。

Oracle指出,新的增强将包括“一个很小的接口,其定义符合(来自Reactive Stream initiative的)广泛参与”,这就是Flow类的来源。

Reactive Streams由4个Java接口构成:

  • 处理器(Processor)
  • 发布商(Publisher)
  • 订阅用户(Subscriber)
  • 订阅(Subscription)

Flow类允许相互关联的接口和静态方法来建立流控制组件,其中发布者产生由一个或多个订阅者消费的项目,每个订阅者由订阅管理。

Reactive
Streams构建在java.util.concurrent.Flow容器对象下,开发者可以在这里找到Flow.Publisher,一个用作lambda表达式或方法引用的赋值目标功能接口。该接口可以让开发者更容易生成Flow.Subscription元素,并且将它们链接在一起。

另一个元素Flow.Subscriber,是异步工作机制,由请求触发。它可以从Flow.Subscription请求多个元素,开发者还可以根据需要自定义缓冲区大小。

这些接口适用于并发和分布式异步设置,它们之间的通信依赖于一种简单的流控制形式,可用于避免资源管理问题。

感兴趣的用户可以在java.util.concurrent.Flow下面查看代码示例。

目前已有一些第三方库实现了Reactive Streams接口,你无需等到Java 9发布便可尝试一下。

CompletableFuture新特性
Java
8引进了CompletableFuture,继承自Future<T>。Futures是非常有用的,当我们不希望或者不需要一个直接计算结果的时候,我们会收到一个Future对象来保存计算完成时分配的实际结果。通过调用complete()方法并且无需异步等待即可显式完成。它还允许在一系列操作中构建管道数据流程。

这样,任何类型的可用值都可以在Future中使用默认返回值,即使计算没有完成。这也将成为CompletableFuture提案更新的一部分,包括延迟和超时、更好地支持子类化和一些实用方法。

更多CompletableFuture功能改进和提案,大家可以前往这里查看。

总结
Java 9即将带来一些重大的更新与改进,其中JEP 266会是最有趣的一部分改进。它的改进方案主要来自社区的一些倡议,旨在帮助开发人员解决异步处理方面的一些重大问题。

作者:佚名

来源:51CTO

时间: 2024-11-03 15:57:19

Java 9的这一基本功能,你可能从未听过的相关文章

Java 8无人谈及的八大功能

时间戳锁 一直以来,多线程代码是服务器开发人员的毒药(问问Oracle的Java语言架构师和并行开发大师Brian Goetz).Java的核心库不断加入各种复杂的用法来减少访问共享资源时的线程等待时间.其中之一就是经典的读写锁(ReadWriteLock),它让你把代码分成两部分:需要互斥的写操作和不需要互斥的读操作. 表面上看起来很不错.问题是读写锁有可能是极慢的(最多10倍),这已经和它的初衷相悖了.Java 8引入了一种新的读写锁--叫做时间戳锁.好消息是这个家伙真的非常快.坏消息是它使

微信-我用java做了几个小功能,想放到公众号上可以访问,现在不知道怎么办了,请帮助,能留下QQ最好

问题描述 我用java做了几个小功能,想放到公众号上可以访问,现在不知道怎么办了,请帮助,能留下QQ最好 用jsp做的几个小功能,想要在微信订阅号上可以访问,求帮助,能留下QQ最好,谢谢了 解决方案 申请公众号 我同学是用jfinal开发的

图片-用Java怎么实现查找价格区间功能?

问题描述 用Java怎么实现查找价格区间功能? 定义的gPrice是String类型,可以改动,怎么才能做出价格区间的查找呢? 解决方案 你输入的内容最后转换成了String,应该直接转成double类型, double price=sc.nextDouble. for(int i = 0 ; i <list.size() ; i++){ Goods g = list.get(i); //把g.gPrice转换成double类型 double gPrice = Double.valueOf(g.

c# 客户端 调用 java Webservice 实现图片上传功能

问题描述 c# 客户端 调用 java Webservice 实现图片上传功能 no SOAPAction header c#端添加服务引用 生成实体类 直接调用webservice图片上传方法 结果报错**no SOAPAction header** 解决方案 有没有大神 来帮帮忙 解决方案二: 参考这个:http://blog.csdn.net/wxyong3/article/details/38727503

java怎么实现类似HTTPWatch的功能,打开url地址后请求的资源

问题描述 java怎么实现类似HTTPWatch的功能,打开url地址后请求的资源 目前很多浏览器都有这样的功能,在地址栏中输入连接后中可以通过httpwatch,清楚的看到此连接已经请求了多少资源(图片,css,js)等等.想问问高手,如何利用java实现,或者说java有没有这种开源的工具. 想实现的功能如图,我在地址栏中输入www.hao123.com后,可以看到它向服务器进行了很多资源的请求.我想知道的如何通过java来获取这些请求资源.

java 网站上做语音直播功能,用到哪些技术?

问题描述 java 网站上做语音直播功能,用到哪些技术? 用java开发的网站上想做语音直播功能,用到哪些技术?求大神支招,小弟谢谢啦 解决方案 流媒体服务器+客户端播放器,都有现成的软件

io流-求帮忙理解一个JAVA程序,该程序的功能是将次行块风格的代码转换成行尾块

问题描述 求帮忙理解一个JAVA程序,该程序的功能是将次行块风格的代码转换成行尾块 package exercise_9; import java.util.*; import java.io.*; public class Exercise9_16 { /**Main method*/ public static void main(String[] args) throws Exception { // Check command line parameter usage if (args.

Oracle 有导出 CSV 文件的功能,java可以调用Oracle的这个功能吗?

问题描述 大家好,请问Oracle有导出CSV文件的功能,java可以调用Oracle的这个功能吗?如果有如何做?谢谢您的回答,(俺是萝卜) 解决方案 解决方案二:应该要自己写方法的吧,再导出为csv文件.我猜的.呵呵解决方案三:不知道是不是能调用但是我觉得有调用它的那个工夫,自己都写了一个导出CSV的模块了

Java Math 类中的新功能,第 1 部分: 实数

有时候您会对一个类熟悉到忘记了它的存在.如果您能够写出 java.lang.Foo 的文档, 那么 Eclipse 将帮助您自动完成所需的函数,您无需阅读它的 Javadoc.例如,我使用 java.lang.Math(一个我自认为非常了解的类)时就是这样,但令我吃惊的是,我最近偶然 读到它的 Javadoc -- 这可能是我近五年来第一次读到,我发现这个类的大小 几乎翻了一倍,包含 20 种我从来没听说过的新方法.看来我要对它另眼相看了. Java 语言规范第 5 版向 java.lang.M

用Java动态代理类实现记忆功能

记忆是衍生自Lisp,Python,和Perl等过程性语言的一种设计模式,它可以对前次的计算结果进行记忆. 一个实现了记忆功能的函数, 带有显式的cache, 所以, 已经计算过的结果就能直接从cache中获得, 而不用每次都进行计算. 记忆能显著的提升大计算量代码的效率. 而且是一种可重用的方案. 本文阐述了在Java中使用这一模式的方法,并提供了一个可以提供上述功能的"记忆类": Foo foo = (Foo) Memoizer.memoize(new FooImpl()); 这里