Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

CountDownLatch

Счётчик, который позволяет одному потоку дождаться, пока другие выполнят N действий.

Доступно с: Java 1.5

Синтаксис

public class CountDownLatch
public CountDownLatch(int count)

Параметры

ПараметрТипОписание
countintСколько раз нужно вызвать `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 и общий объект блокировки.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.