对 CountedCompleter 的文档和来源感到困惑
Confused by docs and source of CountedCompleter
这里是java.util.concurrent.CountedCompleter
class (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;
}
}
这让我很困惑。文档说:"and then similarly tries to complete this task's completer",但我没有看到此任务的完成者对 'complete' 的任何调用;或对它的任何其他调用。
有人用过这个 class 吗?这是文档或实施的问题吗?我也可能以错误的方式烹饪它。任何有关如何正确处理此 class 的想法都将受到赞赏。
你糊涂了?每个人都很困惑。四年来,我一直在撰写有关 F/J 框架的评论,我可以告诉您,8u40 的复杂程度已达到临界水平。这个 class 存在的原因是因为 join() doesn't work。为了绕过 Java8 流的停滞线程,架构师发明了这个 class.
这个 class 的工作方式是为每个 fork() 添加 ToPendingCount()。在 compute() 中,完成后,您将尝试 Complete()。当计数为零时,该方法调用您的 onCompletion()。有点乱,但如果你的代码很简单,它就可以工作。
您看到的其余代码适用于当前 CountedCompleter 具有自己的 CountedCompleter 对象链的情况。我猜这可能是为了 parallel.stream 处理。
这里是java.util.concurrent.CountedCompleter
class (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;
}
}
这让我很困惑。文档说:"and then similarly tries to complete this task's completer",但我没有看到此任务的完成者对 'complete' 的任何调用;或对它的任何其他调用。
有人用过这个 class 吗?这是文档或实施的问题吗?我也可能以错误的方式烹饪它。任何有关如何正确处理此 class 的想法都将受到赞赏。
你糊涂了?每个人都很困惑。四年来,我一直在撰写有关 F/J 框架的评论,我可以告诉您,8u40 的复杂程度已达到临界水平。这个 class 存在的原因是因为 join() doesn't work。为了绕过 Java8 流的停滞线程,架构师发明了这个 class.
这个 class 的工作方式是为每个 fork() 添加 ToPendingCount()。在 compute() 中,完成后,您将尝试 Complete()。当计数为零时,该方法调用您的 onCompletion()。有点乱,但如果你的代码很简单,它就可以工作。
您看到的其余代码适用于当前 CountedCompleter 具有自己的 CountedCompleter 对象链的情况。我猜这可能是为了 parallel.stream 处理。