Что такое защелка обратного отсчета в Java и как она используется?
CountDownLatch был представлен в JDK 1.5 вместе с другими параллельными утилитами, такими как CyclicBarrier, Semaphore, ConcurrentHashMap и BlockingQueue в пакете java.util.concurrent. Этот класс позволяет потоку Java ждать, пока другой набор потоков не завершит свои задачи. Например, основной поток приложения хочет дождаться, пока другие потоки служб, отвечающие за запуск служб инфраструктуры, не завершат запуск всех служб.
CountDownLatch работает за счет инициализации счетчика количеством потоков, которое уменьшается (методом countDown()) каждый раз, когда поток завершает свое выполнение. Когда счетчик достигает нуля, это означает, что все потоки завершили свое выполнение, и поток, ожидающий защелки, возобновляет выполнение. Этот счетчик проверяется методом await(). Метод await() блокируется до тех пор, пока счетчик не достигнет нуля.
При этом счетчик не может быть сброшен, если мы хотим сбросить счет, то мы должны использовать Cyclic Barrier
Примеры —
Вариант использования 1: Многопоточный менеджер загрузок. Менеджер загрузки запустит несколько потоков для одновременной загрузки каждой части файла (при условии, что сервер поддерживает несколько потоков для загрузки). Здесь каждый поток будет вызывать метод обратного отсчета созданной защелки. После того, как все потоки закончат выполнение, поток, связанный с защелкой обратного отсчета, объединит части, найденные в разных частях, вместе в один файл.
Вариант использования 2. Рассмотрим сценарий мира ИТ, в котором менеджер разделил модули между командами разработчиков (A и B) и хочет назначить их группе QA для тестирования только тогда, когда обе команды завершат свою задачу. Здесь поток менеджера работает как основной поток, а команда разработчиков работает как рабочий поток. Поток менеджера ожидает, пока поток команды разработчиков завершит свою задачу.
Пример использования 3. Рассмотрим банк, который работает с 9 утра до 3 дня. Банк будет закрыт только тогда, когда обслужит всех клиентов, вошедших до 15:00. Банк будет работать до тех пор, пока все клиенты не покинут помещение. В этом случае банк является основным клиентом CountDownLatch, к которому применяется метод «await()», а клиенты — это те, кто выполняет «countDown()» на защелке.