转载:http://blog.csdn.net/qq_32524177/article/details/77014757
写在前面的话:Java9来了,搜索了很多关于Java9的新特性,但文献不多,特翻译这篇概括性比较强的官方文章以供参考,本人英文水平有限,虽力求每个词语准确,但必然会有一些偏差,请海涵纠正,,详细的更新内容请点击超链接。
在java9中发布了哪些大家期待的令人振奋的新特性呢?
不要因为java9发布前的相对平静就不关注它!JDK的核心代码提交者们正在努力地为下个版本的发布做准备,这个版本预计于2017年9月就可以被普遍使用。
早期的可访问项目构建(access builds)已经随处可见,现在我们正通过"Java9倒计时网"为能够获取这个版本倒计时.
现在我们能够获得一张相当清晰的,我们能期望在java9中出现的新特性蓝图.如果Java8能被描述成主要是Lambda表达式、数据流和API变更的发布版本,那么java9主要是Jigsaw(The primary goals of this Project are to:Make the Java SE Platform, and the JDK, more easily scalable down to small computing devices;Improve the security and maintainability of Java SE Platform Implementations in general, and the JDK in particular;Enable improved application performance; and Make it easier for developers to construct and maintain libraries and large applications, for both the Java SE and EE Platforms.To achieve these goals we propose to design and implement a standard module system for the Java SE Platform and to apply that system to the Platform itself, and to the JDK. The module system should be powerful enough to modularize the JDK and other large legacy code bases, yet still be approachable by all developers.)、jshell(我们在运行简单代码时不用再写main方法了)以及一系列的高级选项和API更新。在这次发布中我们搜集了一些我们认为会是Java9中最让人振奋的特性--除了最常见的猜想之外,Jigsaw项目承载着拆分Java运行环境并且使Java的核心组件更加的模块化。
以下是一些必须了解的Java9的特性,其中一些已经在早期发布的版本能够让你随意修补。
1.Java+REPL=Jshell(ps:R(read)、E(evaluate)、P(print)、L(loop)顾名思义:读取,计算,打印,循环-交互式解释器环境 )
是的,先前我们还在怀疑kulla(这个项目的目的是调查在java编程语言的REPL工具的产物是否如同在java优化提案中描述的那样)项目能否及时完成为Java9的任务(为java9提供jshell服务)但是现在
它已经获得官方的认可。下个版本的java会重点推出一个被称为Jshell的命令行工具,使得java对REPL原生支持并且更加的通俗化。意思就是说,举个例子,如果你想让一些短短数行的java代码自己运行起来,
你不用再将他们包装成单独的项目或者方法。哦,对了,还有分号,你可忘记它们了:
-> 2 + 2
| Expression value is: 4
| assigned to temporary variable $1 of type int
(对于REPL)现在有很多很多的替代选择,比如一些流行开发工具的REPL插件或者像JAVA REPL web控制台这样的解决方案,但是到目前为止都没有正确的并且官方的方式来处理它。Jshell已经在先前发布的版 本中可用了,它正等着你给他一个测试运行。
2.值得注意的API更新:并发和栈遍历
做为这次更新的一部分,我们希望在这次更新发布以后有额外的、覆盖广泛的特性。
在这里我们想提及的最重要的事就是Java9并发性api基于CompletableFuture(1.8以后才有的interface,继承自java.util.concurrent.Future,没用过,大概的意思就是当你不需要或者不想立马获取某个计算的结果时,我们使用FUture对象来"占位"等待计算完成)和java.util.concurrent.Flow类的更新。Flow是响应式流API的实现,我们非常开心的是它来到了java。响应式流解决了背压之痛(在rxjava中会经常遇到一种情况就是被观察者发送消息太快以至于它的操作符或者订阅者不能及时处理相关的消息。那么随之而来的就是如何处理这些未处理的消息)。当传入任务率高于应用本身的处理能力来处理数据时,数据的内建产生,这会为未处理的数据产生一个缓冲区。作为并发更新的一部分,CompletableFuture类也会获得一次更新,这次更新会解决自Java8对他们的介绍后发出的抱怨。这次更新包括支持延时和超时,更好的支持子类化以及增加了一些实用的方法。
在这里我们想提及的第二件事就是栈遍历API。是的,Java9会改变你遍历栈追踪(StackTrace)的方式.从根本上来说,这是一个Java官方的处理栈追踪的方式,而不是仅仅把它们当做纯文本来处理。这听起来有点像一份模糊的"星球大战"计划参考,让我们对它爱不释手。
3.G1将成为新的默认GC
Java仅有一个垃圾收集器是我们经常听到的最普遍的误解,但事实上它有4个。在J9之前,默认的垃圾回收器是‘Parallel
/ Throughput Collector‘,但是现在它被我们在Java7中介绍过的G1取代了。
想了解这些GC之间的部分差别,请点击这里。
一般来说,G1被设计出来是为了更好的支持4GB以上的堆内存以及众所周知的减少频繁的GC暂停,但当有GC暂停时,这个停顿时间会比以前更长。同时我们也和Next Insurance的主观Haim Yadid讨论了关于GC的所有事,希望可以帮你了解更多关于如何在不同GC之间权衡。
4.HTTP2.0是未来的发展趋势
官方的基于谷歌SPDY(应用层协议)算法的HTTP2.0请求注解在不久前通过了审核。SPDY已经展现出了相较于HTTP1.1较大的速度提升,提升率介于11.81%-47.7%之间,同时在大多数现代浏览器中已经有它的实现。
J9将会全面地支持HTTP2.0并且为Java形成新的HTTP客户端,这会替代HttpURLConnection同时实现HTTP2.0和web套接字.另外一件关于这个API的酷事是,它将被作为Java中的‘第一个孵化器模块‘介绍给大众。
孵化器模块事实上是一个实验性的特性,或许它将发展到被下个版本的Java采用,也就是说Java10,或许就被移除了。这是一个非同寻常的Java理念,它在促进实验的同时并不破坏向后兼容性。
5.进程类API得到了巨大的推进(Process 类,抽象类,提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法)
迄今为止,java在控制和管理操作系统进程方面的能力是有局限性的。举个栗子,在早期版本的Java中为了做一些简单如获取你的进程的PID,你可能需要访问本地代码或者使用一些非同寻常的方式。此外,它还要求对于不同的平台有不同的实现,以确保你获得的结果是正确的。
在JAVA9中,预期的获取Linux进程ID的代码看起来是这样的:
- public static void main(String[] args) throws Exception {
- Process proc = Runtime.getRuntime().exec(new String[] {
- "/bin/sh",
- "-c",
- "echo $PPID"
- });
- if (proc.waitFor() == 0) {
- InputStream in = proc.getInputStream();
- int available = in.available();
- byte[] outputBytes = new byte[available];
- in.read(outputBytes);
- String pid = new String(outputBytes);
- System.out.println("Your pid is " + pid);
- }
- }
现在它变成了这样(这适用于所有的操作系统):
- System.out.println("Your pid is " + Process.getCurrentPid());
这次更新会将Java的能力延伸到和操作系统之间相互作用:
新增直接处理PIDS,进程名和状态的方法以及枚举JVM和进程的能力等等。这对于一些人来说可能不是特别令人兴奋,但是对于OverOps上的我们来说可能会广泛地使用它,因此,
这就是为什么我们考虑在其他的特性在中高亮标注它。
6.产品调试
除了Java9本身以外,我们认为这次发布会成为一次分享一些我们所取得的新进步的机会。解决产品中的错误一直以来都是一个麻烦的事情,在海量的日志文件中寻找线索,并且尝试确认每个导致错误状态的异常或者错误。
但是如果你能完全避免日志文件呢?这里是它怎么做到的。
许多了解它的java开发者有一大堆关于这个工具的问题想问,因此我们也建立了1对1的示例表格,来看看并且制定一个私人的工作计划吧!
此外Java中还移除了一些API,时间有限就不做翻译和列举,请点击查看。