Java 被文档和CountedCompleter的来源弄糊涂了

Java 被文档和CountedCompleter的来源弄糊涂了,java,concurrency,java.util.concurrent,forkjoinpool,Java,Concurrency,Java.util.concurrent,Forkjoinpool,下面是java.util.concurrent.CountedCompleter类(JDK 1.8.025)的代码片段 /** *如果挂起计数非零,则递减计数; *否则调用{@link#onCompletion(CountedCompleter)} *然后同样地尝试完成这个任务的完成器, *如果存在,else将此任务标记为已完成。 */ 公开最终作废tryComplete(){ CountedCompleter a=this,s=a; 对于(int c;;){ 如果((c=a.pending)=

下面是
java.util.concurrent.CountedCompleter
类(JDK 1.8.025)的代码片段

/**
*如果挂起计数非零,则递减计数;
*否则调用{@link#onCompletion(CountedCompleter)}
*然后同样地尝试完成这个任务的完成器,
*如果存在,else将此任务标记为已完成。
*/
公开最终作废tryComplete(){
CountedCompleter a=this,s=a;
对于(int c;;){
如果((c=a.pending)==0){
a、 未完成;
if((a=(s=a).completer)==null){
s、 安静地完成();
返回;
}
}
否则如果(U.compareAndSwapInt(a,待定,c,c-1))
返回;
}
}
这让我很困惑。文档上说:“然后同样地尝试完成这个任务的完成器”,但我没有看到在这个任务的完成器上调用“complete”;或者任何其他的电话


有人在这个班工作过吗?这是文档还是实施方面的问题?我也可能会用错误的方法烹饪。如果您有任何关于如何正确处理这门课的想法,我们将不胜感激。

您感到困惑吗?大家都很困惑。四年来,我一直在写一篇关于F/J框架的评论,我可以告诉你,8u40的复杂性已经达到了临界水平。这个类存在的原因是join()。为了避免Java8流的线程停滞,架构师发明了这个类

这个类的工作方式是为每个fork()添加topendingcount()。在compute()中,完成后,您将尝试完成()。当计数为零时,该方法调用onCompletion()。有点混乱,但如果代码简单,它就可以工作


您看到的其余代码用于当前CountedCompleter拥有自己的CountedCompleter对象链的情况。我猜这可能是为了并行流处理。

我猜,这都要归功于
a=(s=a)。完成
赋值,然后在循环的下一次迭代中执行
a.onCompletion(…)
。谢谢,似乎应该在那里完成;虽然“onCompletion”默认为空,所以实现类似于连接的完成可能不是那么简单和直接。Hello@edharned,可以从这个答案中删除您的个人意见吗?尽管它有点旧。@Kineolyan这个类令人困惑,甚至Doug Lea在JavaDoc中也这么说。这不仅仅是我的选择。截至2015年4月30日,并行流代码尚未最终确定。现在它有了,我的猜测是准确的。到底哪一部分冒犯了你?你好@edharned,我不能说我被冒犯了。我只是觉得最好先回答这个问题。然后,作为一个侧节点,您可以告知这个F/J框架令人困惑,您对它写了评论。。。但应该首先关注答案。KeeOLYYANK,下次我会考虑的。现在,我无法改变这样一个老掉牙(两年多)的答案。
/**
 * 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;
    }
}