先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
}
复制代码
本质上理解,就是将一个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) {
总结
至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:
- 技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
- 项目经历:只写明星项目,描述遵循 STAR 法则;
- 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;
以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
9rTOdjx-1713605221857)]
[外链图片转存中…(img-AdR1iZfz-1713605221857)]
[外链图片转存中…(img-DpbqeAFH-1713605221858)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-BVSuCX9Z-1713605221859)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!