这是java.util.concurrent.CountedCompleter
类(JDK 1.8.0_25)的代码片段。
/**
* 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 tryComplete() {
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;
}
}
这让我真的很困惑。该文档说:“然后类似地尝试完成此任务的完成程序”,但是我看不到对此任务的完成程序进行任何“ complete”调用;或其他任何调用。
有人在这堂课上工作吗?文档或实施是否有问题?我也可能以错误的方式烹饪。任何有关如何正确处理此类的想法都值得赞赏。
最佳答案
你很困惑吗每个人都很困惑。我已经对F / J框架进行了四年的批评,我可以告诉您,复杂性水平已经达到8u40的临界水平。此类之所以存在,是因为join()doesn't work。为了避开Java8流的停滞线程,架构师发明了此类。
此类的工作方式是为每个fork()添加addToPendingCount()。在compute()中,完成后,您尝试tryComplete()。当计数为零时,该方法将调用您的onCompletion()。有点混乱,但是如果您的代码很简单,它就可以工作。
您看到的其余代码用于当当前CountedCompleter具有自己的CountedCompleter对象链时。我的猜测是,这可能是针对parallel.stream处理的。