阅读更多

0顶
0踩

开源软件
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会是最有趣的一部分改进。它的改进方案主要来自社区的一些倡议,旨在帮助开发人员解决异步处理方面的一些重大问题。

引用
原文:The Essential Java 9 Feature You Probably Never Heard Of
作者:Henn Idan 翻译:Daisy 责编:仲培艺
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 前端开发:Vue中forEach() 的使用

    在前端开发中,经常会遇到一些通过遍历循环来获取想要的内容的情形,而且这种情形在开发中无所不在,那么本篇博文就来分享一个比较常用又经典的知识点:forEach() 的使用。 forEach() 是前端开发中操作数组的一种...

  • 【springmvc】servlet3.0无需配置web.xml配置文件的原理

    在最新的SpringMVC项目中,一个web项目中无需配置传统的web.xml配置文件就能正常启动运行,这是怎么实现的呢?其实这并不是SpringMVC的功劳,而是servlet3规范支持无需web.xml,以及web容器对这个规范的实现。 简单...

  • Mybatis框架中mapper配置和foreach标签的使用

    foreach标签下面介绍一下一个mapper配置文件中的foreach标签(注意,要跟着前面的总结来看,这里使用的例子是结合前面的工程写的,大部分代码没有再赘述)foreach的作用是向sql传递数组或List,mybatis使用foreach...

  • Makefile中foreach使用

    因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell (/bin/sh)中的for语句,或是C-Shell(/bin/csh)中的foreach语句而构建的。它的语法是:  $(foreach ,,) 这个函数的...

  • Java中List.forEach()方法使用

    例子: //使用com.google.guava包创建集合 List&lt;String&gt; list =Lists.newArrayList("a","b","c","d"); //1、正常遍历 list.forEach(item-&gt;System.out.println(item));... list.forEach...

  • java中在mybatis的配置文件中使用两个foreach问题

    使用foreach时,一定要注意传入的list是否空。1、使用一个foreach Service层: public List&amp;lt;UserInfo&amp;gt; getListOne() { List&amp;lt;String&amp;gt; nameList = new ArrayList&amp;lt;&amp;gt;(); ...

  • java中jsp页面foreach遍历输出的使用

    导入第二个包后不需要设置配置文件 jsp页面中 &lt;%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %&gt; &lt;%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %&gt; &lt;c:...

  • MyBatis中mapper.xml中foreach的使用

    MyBatis中mapper.xml中foreach的使用 Author:kak &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MySql的动态语句foreach,当传入参数为数组或者集合时需要通过foreach标签进行遍历,其主要是在in条件中...

  • mybatis中的mapper.xml文件中foreach的使用

    一、mapper.java类方法中设置了入参的@Param后,SQL中即使用其定义的字段,如下: 1、collection属性类型是List xxxMapper.java List&lt;ChannelAndAppRelationEntity&gt; queryCoreNameAndAppNoByBorId(@Param(...

  • SQL---insert方法中使用foreach

    如何在Mysql语句的insert语句中使用foreach方法,做循环插入?这里有一个user的集合,users,将其遍历插入到数据库表user中,方法如下:&amp;lt;insert id=&quot;addList&quot; parameterType=&quot;...

  • Java8中的forEach使用

    文章目录forEach1. forEach method2. Java 8 stream forEach example3. Java forEach examle using List4. Java forEach example using Map5....Java中的forEach是一个用于迭代集合或流,且可以对迭代的每个元...

  • 在foreach中使用async/await的问题

    在foreach中使用async/await的问题 问题描述 在一个数组的foreach方法中需要针对数组的每一项发起一个http请求,并且每个请求都需要同步依次处理,开始的代码如下: import urlList from './url.json'; import api ...

  • 在sql中的foreach的使用

    在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况: 1. 如果传入的是单参数且参数类型是一个List的时候,...

  • Mybatis中 foreach 嵌套使用 if 标签对象取值问题

    最近做项目过程中,涉及到需要在 Mybatis 中 使用 foreach 进行循环读取传入的查询条件,动态拼接SQL语句,接口传入的查询条件格式:{"advanceSearchList":[{"searchType":10,"searchText":"12"}]} ,根据我定义的...

  • 在Mybatis中使用in--foreach循环

    1.serviceImpl层 public List&lt;GroupVo&gt; selectGroupInformationListByuserId(String... &lt;foreach item="item" index="index" collection="list" open="(" separator="," close=")"&gt; #{item} &lt;/foreach&gt;

  • vue3.0中使用elementUi(element-plus的使用)

    甲:为什么在vue3.0中不能使用Element UI了? 乙:由于vue3.0在插件install函数的入参从Vue原型(类)改成了app(vue实例),导致element-ui中Vue.prototype.* 这样的代码已经全都失效了。所以element-ui铁定是不...

  • JS中forEach方法的使用

    JS中forEach方法的使用

  • java中foreach的用法

    java中foreach,可以认为是增强版的for语句循环,它可以减少代码量,但是不是所有的foreach都可以代替for循环。 foreach的语句格式:for(元素类型type 元素变量value :遍历对象obj){ 引用x的java语句 } 用法1:...

  • c#中配置文件的使用(一)

    在使用log4net的时候,需要自己来配置相关的文件,之前虽然研究过如何来使用配置文件,但是时间一久还是有点生疏,下面自己做的一些小test,也让自己能够有比较深的印象,在学习过程中,也在网上看到了一位大神写的...

  • 毕设和企业适用springboot企业数据管理平台类及跨境电商管理平台源码+论文+视频.zip

    毕设和企业适用springboot企业数据管理平台类及跨境电商管理平台源码+论文+视频

Global site tag (gtag.js) - Google Analytics