CountDownLatch
Счётчик, который позволяет одному потоку дождаться, пока другие выполнят N действий.
Доступно с: Java 1.5
Синтаксис
public class CountDownLatch
public CountDownLatch(int count)Параметры
| Параметр | Тип | Описание |
|---|---|---|
| count | int | Сколько раз нужно вызвать `countDown()`, чтобы открыть «защёлку». |
Примеры
Ждём, пока все сервисы запустятся:
void main() throws InterruptedException {
List<String> services = List.of("db", "cache", "mail");
var ready = new CountDownLatch(services.size());
for (String s : services) {
Thread.startVirtualThread(() -> {
try { Thread.sleep(100); } catch (InterruptedException e) { return; }
ready.countDown();
});
}
ready.await();
IO.println("All " + services.size() + " services are up, count = " + ready.getCount());
}Результат:
All 3 services are up, count = 0Примечания
countDown() уменьшает счётчик, await() блокирует, пока он не станет нулём. Защёлка одноразовая — сбросить её нельзя; для повторяющихся «барьеров» есть CyclicBarrier и Phaser. await(timeout, unit) позволяет ждать ограниченное время.
См. также
- Thread.join() — Ждёт, пока поток завершится.
- ExecutorService.close() — Закрывает пул и ждёт завершения всех задач; вызывается автоматически в try-with-resources.
В учебнике
- Синхронизация — Гонка данных в Java и как её избежать — synchronized-методы и блоки, атомарные классы AtomicInteger, ReentrantLock и общий объект блокировки.