【发布时间】:2015-04-30 11:28:41
【问题描述】:
这是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;
}
}
这让我很困惑。文档说:“然后类似地尝试完成这个任务的完成者”,但我没有看到在这个任务的完成者上调用任何“完成”;或对它的任何其他调用。
有人学习过这门课吗?这是文档或实施的问题吗?我也可能用错误的方式烹饪它。任何如何正确处理此类的想法都值得赞赏。
【问题讨论】:
-
我猜,这一切都归功于
a = (s=a).completer分配,然后在循环的下一次迭代中执行a.onCompletion(...)。 -
谢谢,看来应该在那里完成;虽然 'onCompletion' 默认是 void 和空的,所以实现类似连接的完成可能不是那么容易和直接。
标签: java concurrency java.util.concurrent forkjoinpool