• 奔驰R级优惠10.7万元 少量现车火热促销 2019-07-10
  • 侯晓春会见岳剑利一行 2019-07-10
  • 辽宁:电商成为精准扶贫的“利器” 2019-07-04
  • 人人都能享用绿豆汤吗 关于绿豆汤的禁忌你得知道 2019-07-04
  • 早晨空腹饮水有利健康?正确饮水你需要知道这些 2019-07-01
  • 微博大数据:海信强势领跑世界杯“中国赞助队” 2019-06-29
  • 新疆各族群众体验端午传统文化 2019-06-28
  • 感恩消防员 “小志”成获救婴儿新小名(图) 2019-06-28
  • 5G标准出炉!与4G有啥不一样? 或1秒内下载1G电影 2019-06-26
  • 【克山天气】最新克山今天天气,实时提供克山气温、空气质量、24小时天气预报、生活指数查询 2019-06-26
  • 不管怎么讲幸福,老百姓的愿望并不奢望,就是看病不难,不贵,不需要没钱就从手术台赶 下来,只能住医院过道,房子并不要太大,能避风挡雨,子女并不要万贯家财,能有一份 2019-06-24
  • 南岸开展“幸福邻里 粽情端午”志愿服务活动 2019-06-24
  • 一语惊坛(5月9日):推动中朝友谊,造福两国人民。 2019-06-23
  • 网红主播直播违法屡屡发生 法律意识淡薄是主因 2019-06-22
  • “119”消防日大型特别节目《中国骄傲》11月9日播出 2019-06-22
  • 通过源码深入分析Java 8 中的Stream实现原理(下 ...  

    青海快三中奖号码 www.yhxn.net 2019-05-20 10:23 发布

    2411 0 0
      上一片文章我们介绍了创建Stream部分的实现原理,今天我们接着分析Stream剩下的内容。
      首先我们看看和Stream相关的内容都有哪些:
      
      Stream上的操作
      前面我们介绍过Stream上的操作分为两大类:中间操作和终端操作。其中中间操作的作用是把Stream转换为另外一个Stream,终端操作是开启Stream的计算过程。所以要区分一个操作是中间操作还是终端操作,只需要看看它的方法返回值是不是Stream,返回值是Stream的就是中间操作了,不是的话就是终端操作了。
      下面我们就分别对中间操作和终端操作进行分析。
      中间操作的实现原理
      我们随便找一个中间操作来看看它的实现过程,就以filter为例吧。Stream是一个接口类,它的filter方法具体的实现实际上是ReferencePipeline.filter,下面就是它的实现代码:
      通过源码深入分析Java 8 中的Stream实现原理(下)
      我们先忽略掉那些周边代码,直接去看最为核心的一小段代码:
      通过源码深入分析Java 8 中的Stream实现原理(下)
      这段代码逻辑非常的简单:调用predicate来判断元素u是否需要过滤,如果不需要过滤就调用下一个Stream的accept方法,参数predicte就是我们调用filter方法是传入的参数。对于熟悉Java职责链模式的朋友一定非常清楚这个过程的作用。
      filter操作的核心就这么两三行代码,接下来我们开看看核心代码周围的那些代码是干嘛的。分析代码后我们发现:
      accept是Sink.ChainedReference类的一个方法。
      Sink.ChainedReference实例是在opWrapSink方法中被创建的。
      opWrapSink方法则是StatelessOp类的一个方法。
      StatelessOp实例则是我们在调用filter方法的时候创建的。
      所以当我们调用filter方法的时候实际是创建了一个StatelessOp的实例,并被返回了,毫无疑问StatelessOp类是实现了Stream接口的。
      终端操作
      讲完了中间操作的内容后,我们在看看终端操作又是个什么样子的,就以count操作为例。
      首先我们看看count操作的源码:
      通过源码深入分析Java 8 中的Stream实现原理(下)
      count操作其实是有两个操作组成的,mapToLong操作是一个中间操作,作用是把每一个元素都转换为1,sum操作则是一个终端操作,作用是对所有元素求和。所以要分析终端操作,我们只需要分析sum操作就可以了。
      下面是sum操作所对应的源码:
      通过源码深入分析Java 8 中的Stream实现原理(下)
      sum方法最终调用的是reduce方法,在这个方法中会做两个事情:
      创建一个ReduceOps实例,ReduceOps实际是TerminalOp接口的一个实现。
      调用evaluate方法执行执行终端操作。
      从这里我们就发现终端操作和中间操作的区别了,在终端操作中不仅仅会创建一个操作实例,还会去执行它,在中间操作中是不会有这个执行过程的。
      Stream的执行过程
      分析完Stream的两大类操作后,我们就需要进一步分析一下它们是如何被执行并最终操作集合中的元素的。上面的分析我们知道中间操作是不会触发任何执行的,只有终端操作才会调用evaluate方法执行整个操作链,这就是延迟执行了。首先我们看看evaluate方法的实现代码:
      通过源码深入分析Java 8 中的Stream实现原理(下)
      这段代码主要功能有:判断Stream是否计算过了,如果没有计算过才会放行并标记(所以一个流只能被执行一次),然后根据是否标记了并行处理来调用不同的方法(并行与否可以进行多次设置,以最后一次为准)。
      我们先分析串行的情况,并行的内容后续详细来分析。ReduceOp.evaluateSequential相关的源码:
      通过源码深入分析Java 8 中的Stream实现原理(下)
      一路跟着代码走,我们可以发现整个执行过程包括两部分:
      调用wrapSink方法构建整个职责链。这个方法中会反向遍历操作链表,并调用每一个操作的opWrapSink方法,这个方法我们在前面讲中间操作的时候已经介绍过了,它会创建一个Sink.ChainedReference实例。
      构建完职责链以后,就从职责链最前端启动它。职责链调用分为三个阶段:begin--操作开始,forEachRemaining--操作元素,会去调用sink的accept方法,end--操作结束。
      下面我们用一个流程图来直观的描述整个过程:
      通过源码深入分析Java 8 中的Stream实现原理(下)
      并行操作
      讲完了基础的串行流,我们接下来讲一讲并行流。所谓的并行流,就是我们的流操作上的任务是被拆分成多个子任务,然后同时执行。Stream的并行功能是基于Java的Fork/Join框架的,什么是Fork/Join框架呢?我们这里就不详细介绍了,只需要知道它是一个把任务拆分执行的框架就可以了,后续有机会再做详细的介绍。
      Fork/Join框架使用的关键就是定义一个ForkJoinTask的派生类,然后调用它的invoke方法。
      下面是并行流的执行方法:
      通过源码深入分析Java 8 中的Stream实现原理(下)
      这个ReduceTask就是ForkJoinTask的派生类。Fork/Join框架的task最为关键的就是大任务拆分的过程了(fork过程),我们看看ReduceTask的拆分过程的源码:
      通过源码深入分析Java 8 中的Stream实现原理(下)
      这段代码有一丢丢长,其主要操作包括下面几个部分:
      计算元素个数,以及分片阈值,只有元素个数大于这个阈值才会进行任务拆分。
      构建任务二叉树,并进行fork
      最后对最小的分片进行计算并join结果


    *滑块验证:
    您需要登录后才可以回帖 登录 | 网贷社区—注册

    本版积分规则

    金钥匙网贷金钥匙网贷
    优秀作品:26 作者粉丝:0 关注数量:0 拥有金豆:0 荣誉值数:0
    • 售后服务
    • 关注我们
    • 社区新手
    关闭

    站长推荐上一条 /1 下一条

    快速回复 青海快三中奖号码 返回列表
  • 奔驰R级优惠10.7万元 少量现车火热促销 2019-07-10
  • 侯晓春会见岳剑利一行 2019-07-10
  • 辽宁:电商成为精准扶贫的“利器” 2019-07-04
  • 人人都能享用绿豆汤吗 关于绿豆汤的禁忌你得知道 2019-07-04
  • 早晨空腹饮水有利健康?正确饮水你需要知道这些 2019-07-01
  • 微博大数据:海信强势领跑世界杯“中国赞助队” 2019-06-29
  • 新疆各族群众体验端午传统文化 2019-06-28
  • 感恩消防员 “小志”成获救婴儿新小名(图) 2019-06-28
  • 5G标准出炉!与4G有啥不一样? 或1秒内下载1G电影 2019-06-26
  • 【克山天气】最新克山今天天气,实时提供克山气温、空气质量、24小时天气预报、生活指数查询 2019-06-26
  • 不管怎么讲幸福,老百姓的愿望并不奢望,就是看病不难,不贵,不需要没钱就从手术台赶 下来,只能住医院过道,房子并不要太大,能避风挡雨,子女并不要万贯家财,能有一份 2019-06-24
  • 南岸开展“幸福邻里 粽情端午”志愿服务活动 2019-06-24
  • 一语惊坛(5月9日):推动中朝友谊,造福两国人民。 2019-06-23
  • 网红主播直播违法屡屡发生 法律意识淡薄是主因 2019-06-22
  • “119”消防日大型特别节目《中国骄傲》11月9日播出 2019-06-22
  • 高手惠泽网单双中特料 25选5一等奖多少钱 nba球员排名实力排名 网球肘的症状治疗方法 四肖中特铁算盘 体育彩票走势图排五 福建快3玩法 足彩半全场胜负平 微信福利彩票群昵称 白光透视麻将哪里有卖 看辽宁十一选五走势图 彩票內部透码彩图 幸运武林投注秘诀 百人牛牛游戏规则怎么玩的技巧 天津11选5走势图遗漏