CyclicBarrier 是否会为最后一次等待重置自身?

Does CyclicBarrier reset itself for the last await?

我正在学习 CyclicBarrier 并编写了这个演示。

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import static java.util.concurrent.ThreadLocalRandom.current;
public class CyclicBarrierDemo {
    public static void main(final String[] args) {
        final int threads = 100;
        final CyclicBarrier barrier
            = new CyclicBarrier(threads, () -> System.out.println("tripped"));
        final int rounds = 5;
        for (int i = 0; i < threads; i++) {
            new Thread(() -> {
                    for (int j = 0; j < rounds; j++) {
                        try {
                            Thread.sleep(current().nextLong(1000L));
                            barrier.await();
                        } catch (InterruptedException | BrokenBarrierException e) {
                            e.printStackTrace(System.err);
                            return;
                        }
                    }
            }).start();
        }
    }
}

程序打印五个 tripped 并退出,如我所料

tripped
tripped
tripped
tripped
tripped

我的问题是 CyclicBarrier 实例在最后一个 await() 到达时自行重置?这样输出是预期的吗?我找不到任何词来形容它。

My question is that the CyclicBarrier instance reset itself when the last await() arrived?

是的。从某种意义上说,该实例可以在应用程序不需要做任何事情的情况下被重用。

So that the output is expected?

I couldn't find any words for that.

Javadoc 说:“屏障被称为循环屏障,因为它可以在等待线程被释放后重新使用。”

此外,javadoc 中显示的示例只有在实例自行重置时才能按照描述的方式工作。请注意,没有对 reset() 的显式调用。 (此外,根据方法的 javadoc,如果您想重用屏障,则明确调用 reset() 是否有用还不清楚。)

将 CyclicBarrier 视为门,将线程视为汽车。

(障碍) 直到看到 100 辆车在门前等候时才会打开。当它打开时,它只会让那批100辆汽车通过并再次关闭。同样的事情会再次发生 (cyclic).