Java Parallel Stream 源码深入解析,京东物流java面试流程图

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

}

复制代码

本质上理解,就是将一个Spliterator进行切分成两部分,然后两部分再进行切分,直到while()条件无法再满足,然后对该部分进行运算,将运算结果保存在节点的LocalResult字段上。这部分就是分支的切分阶段。

结果合并


测试代码:

long count = Stream.of(1, 2, 3, 4, 5).parallel().reduce((x, y) -> x + y + 10).get();

复制代码

AbstractPipeline.evaluate() 方法是并行流与串行流的分叉点:

final R evaluate(TerminalOp<E_OUT, R> terminalOp) {

assert getOutputShape() == terminalOp.inputShape();

if (linkedOrConsumed)

throw new IllegalStateException(MSG_STREAM_LINKED);

linkedOrConsumed = true;

return isParallel()

? terminalOp.evaluateParallel(this, sourceSpliterator(terminalOp.getOpFlags())) //并行流执行点
terminalOp.evaluateSequential(this, sourceSpliterator(terminalOp.getOpFlags()));

}

复制代码

ReduceOps.evaluateParallel() 方法是其实现之一

@Override

public <P_IN> R evaluateParallel(PipelineHelper helper,

Spliterator<P_IN> spliterator) {

return new ReduceTask<>(this, helper, spliterator).invoke().get();

}

复制代码

主要做了两件事:

  • 创建一个ReduceTask任务

  • 任务调用invoke()执行

创建的逻辑没有额外的操作,就是将三个参数赋值到实例变量中。

invoke()是ForkJoinTask的方法,方法这里主要关注invoke() 方法的逻辑:

/**

  • Commences performing this task, awaits its completion if

  • necessary, and returns its result, or throws an (unchecked)

  • {@code RuntimeException} or {@code Error} if the underlying

  • computation did so.

  • @return the computed result

*/

public final V invoke() {

int s;

//执行任务

if ((s = doInvoke() & DONE_MASK) != NORMAL)

reportException(s);

// 这里放回的是最终结果

return getRawResult();

}

复制代码

/**

  • Implementation for invoke, quietlyInvoke.

  • @return status upon completion

*/

private int doInvoke() {

int s; Thread t; ForkJoinWorkerThread wt;

return (s = doExec()) < 0 ? s :

((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) ?

(wt = (ForkJoinWorkerThread)t).pool.

awaitJoin(wt.workQueue, this, 0L) :

externalAwaitDone();

}

==> JDK代码为了性能,牺牲了可读性,这里整理下:

private int doInvoke() {

s = doExec();

if (s < 0) return s;

t = Thread.currentThread();

if (t instanceof ForkJoinWorkerThread) {

ForkJoinWorkerThread wt = (ForkJoinWorkerThread)t.pool();

return wt.awaitJoin(wt.workQueue,this,0L);

}

return externalAwaitDone();

}

复制代码

/**

  • If the pending count is nonzero, decrements the count;

  • otherwise invokes {@link #onCompletion(CountedCompleter)}

  • and then similarly tries to complete this task’s completer,

  • if one exists, else marks this task as complete.

*/

public final void tryComplte() {

CountedCompleter<?> a = this, s = a;

for (int c;😉 {

if ((c = a.pending) == 0) {

a.onCompletion(s);

if ((a = (s = a).completer) == null) {

s.quietlyComplete();

return;

}

}

else if (U.compareAndSwapInt(a, PENDING, c, c - 1))

return;

}

}

复制代码

ReduceOps.onCompletion() 的重写方法中,如果是不是叶子节点,则合并两个子节点的结果:

@Override

public void onCompletion(CountedCompleter<?> caller) {

if (!isLeaf()) {

//如果不是叶子节点,将左右两个子节点的结果合并。

S leftResult = leftChild.getLocalResult();

leftResult.combine(rightChild.getLocalResult());

setLocalResult(leftResult);

}

// GC spliterator, left and right child

super.onCompletion(caller);

}

复制代码

关注里面3个方法:

  • isLeaf()

  • combine()

  • super.onCompletion()

isLeaf()判断是不是叶子节点,只有非叶子节点才有两个子节点,然后才能进行合并任务:

protected boolean isLeaf() {

return leftChild == null;

}

复制代码

节点在执行完后调用super.onCompletionc(caller) 方法, 字段设为null,为了gc

@Override

public void onCompletion(CountedCompleter<?> caller) {

总结

至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:

  1. 技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
  2. 项目经历:只写明星项目,描述遵循 STAR 法则;
  3. 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

9rTOdjx-1713605221857)]

[外链图片转存中…(img-AdR1iZfz-1713605221857)]

[外链图片转存中…(img-DpbqeAFH-1713605221858)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-BVSuCX9Z-1713605221859)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值