2

我倾向于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()到达时自行重置?所以输出是预期的?我找不到任何形容词。

4

2 回答 2

4

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

直到看到 100 辆汽车在它前面等待,大门(屏障)才会打开。当它打开时,它只会允许那批 100 辆汽车通过并再次关闭。同样的事情会再次发生(循环)

于 2017-03-01T08:27:29.837 回答
3

我的问题是 CyclicBarrier 实例在最后一个 await() 到达时自行重置?

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

所以输出是预期的?

是的

我找不到任何形容词。

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

此外,javadoc 中显示的示例仅在实例自行重置的情况下才能正常工作。请注意,没有明确调用reset(). (此外,根据方法的 javadoc,如果您想重用屏障,则不清楚显式调用reset()是否有用。)

于 2017-03-01T08:16:26.097 回答