Из его звуков вы, вероятно, захотите CountDownLatch . Предполагая, что вы знаете количество потоков / участников, вы просто создаете один для этого количества, а затем, когда ваша нить закончится, начнут обратный отсчет и ждут защелки:
final int workers = …
final CountDownLatch latch = new CountDownLatch(workers);
void doSomething() throws InterruptedException {
…
latch.countDown();
latch.await(); // blocks, throws InterruptedException
}
По сравнению с CyclicBarrier
, CountDownLatch
не может использоваться повторно, вы можете использовать его только один раз. Однако он разделяет задачи ожидания и освобождения, поэтому у вас может быть, например, другой поток, который пропускает потоки.
С учетом всего сказанного, если вам нужен CyclicBarrier
небольшое изменение в приведенном выше коде , должно работать:
final int workers = …
final CyclicBarrier barrier = new CyclicBarrier(workers);
void doSomething() throws InterruptedException, BrokenBarrierException {
…
latch.await(); // blocks, throws InterruptedException, BrokenBarrierException
}
однако, если какой-либо поток прерывается или вызывается barrier.reset()
, барьер преодолевается и выдается исключение.