在Java中,一旦CountdownLatch达到其状态= 0,它就无法更改它,因此它将永远保持打开状态。我想知道为什么实现者不允许重用CountDownLatch?
答案 0 :(得分:5)
如果可以重复使用,您将如何处理不同的到达迭代?例如,假设您要等待CountDownLatch
。
CountDownLatch latch = new CountDownLatch(1);
latch.await();
然后一个线程调用
latch.countDown();
await
已发布。现在你有另一个线程,只有在先前的线程倒计时才会释放。所以你调用latch.await()
。如果锁存器是可变的,那么线程应该等待还是继续通过?闩锁如何知道这等待不应该是另一个周期(或阶段)?
最后,它并非如此。可变锁存器很难,但它是可能的。 Java 7推出Phaser。它将每个下一次迭代视为一个阶段,您可以告诉移相器等待特定阶段:
phaser.awaitAdvance(phase);
答案 1 :(得分:1)
因为它是CountDownLatch的特定功能。如果CountDownLatch将重置其计数器,那么它的行为就像CyclicBarrier
答案 2 :(得分:0)
您可以这样做:
ReusableCountLatch latch = new ReusableCountLatch(); // creates latch with initial count 0
ReusableCountLatch latch2 = new ReusableCountLatch(10); // creates latch with initial count 10
latch.increment(); // increments counter
latch.decrement(); // decrement counter
latch.waitTillZero(); // blocks until counts falls to zero
boolean succeeded = latch.waitTillZero(200, MILLISECONDS); // waits for up to 200 milliseconds until count falls to zero
int count = latch.getCount(); // gets actual count
要使用它,您只需添加一个依赖项:
compile 'com.github.matejtymes:javafixes:1.3.0'