CountdownLatch — это конструкции синхронизации потоков, предоставляемые языком Java, которые можно использовать для координации выполнения нескольких потоков.

CountDownLatch — это одноразовая конструкция синхронизации, которая ожидает завершения набора операций, выполняемых в других потоках. Он инициализируется счетчиком, и каждый раз, когда поток завершает часть операции, он уменьшает счетчик. Когда счетчик достигает нуля, защелка освобождается, и ожидающему потоку разрешается продолжить работу.

Вот пример того, как можно использовать CountDownLatch.

Предположим, у вас есть система, в которой необходимо запустить несколько служб, прежде чем основное приложение сможет продолжить работу. Вы можете использовать CountDownLatch, чтобы дождаться запуска всех служб, прежде чем продолжить работу основного приложения. Вот пример кода:

import java.util.concurrent.CountDownLatch;

public class MainApplication {

    private static final int NUM_SERVICES = 3;
    private static CountDownLatch latch = new CountDownLatch(NUM_SERVICES);

    public static void main(String[] args) throws InterruptedException {
        // Start the services in separate threads
        startService("Service A");
        startService("Service B");
        startService("Service C");

        // Wait for all services to start up
        latch.await();

        // All services have started, continue with main application logic
        System.out.println("All services started, continuing with main application...");
    }

    private static void startService(String serviceName) {
        new Thread(() -> {
            System.out.println("Starting " + serviceName + "...");
            // Do some service startup work...
            // ...
            // Signal that the service has started
            latch.countDown();
            System.out.println(serviceName + " started.");
        }).start();
    }
}

В этом примере у нас есть три службы (служба A, служба B и служба C), которые необходимо запустить, прежде чем основное приложение сможет продолжить работу. Мы создаем CountDownLatch со счетчиком 3, который представляет количество служб, которые необходимо запустить.

Каждая служба запускается в отдельном потоке с использованием метода startService. Прежде чем поток службы завершит свою работу по запуску, он вызывает метод countDown() на защелке, чтобы сигнализировать о том, что он запущен. Это уменьшит счетчик защелки.

Поток main ожидает запуска всех служб, вызывая метод await() на защелке. Это заблокирует основной поток, пока счетчик защелок не достигнет нуля. Как только все службы запущены, количество защелок достигает нуля, и основной поток может продолжать работу с остальной логикой приложения.

Обратите внимание, что CountDownLatch является конструкцией синхронизации одноразового использования, что означает, что как только счетчик достигает нуля, защелку нельзя сбросить и использовать повторно.