这是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处理的。

09-05 19:06