Это может быть переведено как защелка обратного отсчета (обратный отсчет). Излишне говорить, что защелка означает, как следует из названия, чтобы предотвратить прогресс. Здесь это означает, что метод countdownlatch.await () будет блокировать текущий поток до того, как обратный отсчет будет 0.
Countdownlatch - это синхронный вспомогательный класс, который позволяет одним или нескольким потокам ждать, пока набор операций не выполняется в других потоках.
Countdownlatch работает аналогично методу Thread.join () и может использоваться для сотрудничества между одной группой потоков и другой группой потоков. Например, основной поток нуждается в серии подготовки, прежде чем выполнять работу, и только в случае завершения всех этих приготовлений может продолжить свою работу. Эти препараты не зависят друг от друга, поэтому они могут быть выполнены одновременно для увеличения скорости. В этом сценарии CountdownLatch может использоваться для координации планирования между потоками. В эпоху, когда потоки были созданы непосредственно (до Java 5.0), мы можем использовать Thread.join (). После появления JUC, поскольку потоки в пуле потоков не могут быть непосредственно упомянуты, необходимо использовать CountDownLatch.
Класс Countdownlatch - синхронная счетчик. При построении параметр int проходит. Этот параметр является начальным значением счетчика. Каждый раз, когда называется метод обратного отсчета (), счетчик уменьшается на 1, а счетчик больше 0, метод wait () будет блокировать программу и продолжить выполнение. Countdownlatch можно рассматривать как защелку обратного отсчета, запуская конкретное событие, когда количество сокращено до 0. Используя эту функцию, основной поток может ждать конца детской потока. Ниже приведен пример моделируемого соревнования спортсменов.
Очень типичный сценарий приложения CountdownLatch: есть задача, которая хочет выполнить вниз, но вы должны подождать, пока другие задачи не будут выполнены, прежде чем вы сможете продолжать выполнять вниз. Если наша задача, которую мы хотим продолжать выполнять дальнейшие вызовы метода wait () объекта CountDownLatch, а другие задачи вызывают метод CountDown () на том же объекте CountDownLatch после выполнения собственных задач, задача, которая вызывает метод wait (), будет продолжать блокировать и ожидание значения подсчета объекта обратного отсчета, задача, которая вызовет до 0.
Список функций CountDownLatch
Countdownlatch (int count) создает обратный отсчет, инициализированный с данным количеством. // Заставьте текущую резьбу ждать, пока защелка не будет равен нулю, если нить не будет прервана. void wait () // заставляет текущую резьбу ждать, пока защелка не будет равен нулю, если нить не будет прерывается или не будет превышено указанное время ожидания. Boolean ожидает (длительный тайм -аут, время Unit) // уменьшение количества защелки. Если количество достигнет нуля, все потоки ожидания будут выпущены. void countdown () // Возвращает текущее количество. long getCount () // Возвращает строку, идентифицирующую эту защелку и ее статус. String toString ()
Структура данных CountDownLatch
Диаграмма класса UML CountdownLatch выглядит следующим образом:
Структура данных CountDownLatch проста, она реализована через «общие блокировки». Он содержит объекты Sync, Sync - это тип синхронизации. Sync - это класс экземпляров, который наследует от AQS.
Пример обратного отсчета
Следующее реализуется через Countdownlatch: «Основной поток» ожидает, пока «5 детских потоков» завершит «указанную работу (1000 мс)», прежде чем продолжить работу.
import java.util.concurrent.countdownlatch; import java.util.concurrent.cyclicbarrier; Public Class countdownlatchtest1 {private static int latch_size = 5; Частный статический обратный отсчет, Donesignal; public static void main (string [] args) {try {donesignal = new countdownlatch (latch_size); // Создать 5 новых задач для (int i = 0; i <latch_size; i ++) new innerthread (). Start (); System.out.println («Главный ожидание начинается»); // "Основная нить" ждет завершения 5 задач в пуле потоков, чтобы завершить donesignal.await (); System.out.println («Основное ожидание закончено»); } catch (прерванное искусство e) {e.printstacktrace (); }} static class innerthread extends thread {public void run () {try {thread.sleep (1000); System.out.println (Thread.currentThread (). GetName () + «Sleep 1000 мс.»); // Вычитайте значение countdownlatch на 1 donesignal.countdown (); } catch (прерванное искусство e) {e.printstacktrace (); }}}} Результаты работы:
Главный ожидание начала.thread-0 Sleep 1000 м.
Описание результата: в основном потоке используется donesignal.await () для ожидания, пока другие потоки уменьшат Donesignal до 0. Другие 5 потоков InnerThread, каждый из которых вычитает значение Donesignal на 1 через donesignal.countdown (); Когда Donesignal составляет 0, Main будет продолжать выполняться после пробуждения.
PS: разница между Countdownlatch и Cyclicbarrier:
(1) Функция CountDownLatch состоит в том, чтобы позволить 1 или N потокам ждать, пока другие потоки выполнят выполнение; В то время как Cyclicbarrier позволяет n потокам ждать друг друга.
(2) счетчик обратного отсчета не может быть сброшен; Счетчик Cyclicbarrier может использоваться после сброса, поэтому он называется петлевым барьером.