Spec-Zone.ru › OpenJDK 24

Класс CountDownLatch

java.lang.Object
java.util.concurrent.CountDownLatch
public class CountDownLatch extends Object
Средство синхронизации, которое позволяет одному или нескольким потокам ожидать завершения набора операций, выполняемых в других потоках.

CountDownLatch инициализируется заданным значением count. Методы await блокируют выполнение, пока текущее значение count не станет нулём в результате вызовов метода countDown(), после чего все ожидающие потоки освобождаются, и последующие вызовы await возвращают значение немедленно. Это однократное явление — значение count не может быть сброшено. Если вам нужна версия, которая сбрасывает значение count, используйте класс CyclicBarrier.

CountDownLatch — это универсальный инструмент синхронизации, который может использоваться для различных целей. CountDownLatch, инициализированный значением count равным единице, служит простым счётчиком или воротами: все потоки, вызывающие await, ожидают у ворот, пока они не откроются потоком, вызывающим countDown(). CountDownLatch, инициализированный значением N, может использоваться для ожидания одним потоком, пока N потоков завершат некоторое действие, или пока это действие было выполнено N раз.

Полезное свойство CountDownLatch заключается в том, что потоки, вызывающие countDown, не требуют ожидания, пока count достигнет нуля, прежде чем продолжить. Они просто препятствуют любому потоку перейти за пределы await, пока все потоки не пройдут.

Пример использования: Вот пара классов, в которых группа потоков-работников используют два счётчика обратного отсчёта:

  • Первый — это сигнал старта, который предотвращает выполнение любого работника до тех пор, пока драйвер не будет готов;
  • Второй — это сигнал завершения, который позволяет драйверу дождаться завершения всех работников.
 
 class Driver { // ...
   void main() throws InterruptedException {
     CountDownLatch startSignal = new CountDownLatch(1);
     CountDownLatch doneSignal = new CountDownLatch(N);

     for (int i = 0; i < N; ++i) // create and start threads
       new Thread(new Worker(startSignal, doneSignal)).start();

     doSomethingElse();            // don't let run yet
     startSignal.countDown();      // let all threads proceed
     doSomethingElse();
     doneSignal.await();           // wait for all to finish
   }
 }

 class Worker implements Runnable {
   private final CountDownLatch startSignal;
   private final CountDownLatch doneSignal;
   Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
     this.startSignal = startSignal;
     this.doneSignal = doneSignal;
   }
   public void run() {
     try {
       startSignal.await();
       doWork();
       doneSignal.countDown();
     } catch (InterruptedException ex) {} // return;
   }

   void doWork() { ... }
 }

Другое типичное использование заключается в разделении проблемы на N частей, описании каждой части с помощью Runnable, выполняющего эту часть и уменьшая счётчик обратного отсчёта, и добавлении всех Runnable в Executor. Когда все подзадачи завершены, координирующий поток сможет пройти через await. (Если потоки должны многократно уменьшать счётчик обратного отсчёта, используйте CyclicBarrier.)

 
 class Driver2 { // ...
   void main() throws InterruptedException {
     CountDownLatch doneSignal = new CountDownLatch(N);
     Executor e = ...;

     for (int i = 0; i < N; ++i) // create and start threads
       e.execute(new WorkerRunnable(doneSignal, i));

     doneSignal.await();           // wait for all to finish
   }
 }

 class WorkerRunnable implements Runnable {
   private final CountDownLatch doneSignal;
   private final int i;
   WorkerRunnable(CountDownLatch doneSignal, int i) {
     this.doneSignal = doneSignal;
     this.i = i;
   }
   public void run() {
     doWork();
     doneSignal.countDown();
   }

   void doWork() { ... }
 }

Эффекты согласованности памяти: до тех пор, пока значение count не достигнет нуля, действия в потоке до вызова countDown() происходят до действий, следующих за успешным возвратом из соответствующего await() в другом потоке.

Since:
1.5

Краткое описание конструкторов

Конструктор Описание
CountDownLatch(int count)
Создаёт CountDownLatch с заданным значением count.

Краткое описание методов

Модификатор и тип Метод Описание
void await()
Заставляет текущий поток ожидать, пока счётчик не уменьшится до нуля, если поток не был прерван.
boolean await(long timeout, TimeUnit unit)
Заставляет текущий поток ожидать, пока счётчик не уменьшится до нуля, если поток не был прерван или не истекло заданное время ожидания.
void countDown()
Уменьшает счётчик обратного отсчёта, освобождая все ожидающие потоки, если счётчик достигнет нуля.
long getCount()
Возвращает текущее значение count.
String toString()
Возвращает строку, идентифицирующую этот счётчик, а также его состояние.

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

Подробное описание конструкторов

CountDownLatch

public CountDownLatch(int count)
Создаёт CountDownLatch с заданным значением count.
Параметры:
count - количество вызовов countDown(), необходимое для того, чтобы потоки смогли пройти через await()
Исключения:
IllegalArgumentException - если значение count отрицательное

Подробное описание методов

await

public void await() throws InterruptedException
Заставляет текущий поток ожидать, пока счётчик не уменьшится до нуля, если поток не был прерван.

Если текущее значение count равно нулю, этот метод возвращается немедленно.

Если текущее значение count больше нуля, текущий поток отключается от планирования потоков и приостанавливается до тех пор, пока не произойдёт одно из двух событий:

  • Значение count станет нулём в результате вызовов метода countDown(); или
  • Другой поток прерывает текущий поток.

Если в текущем потоке:

  • Флаг прерывания установлен при входе в этот метод; или
  • Поток прерывается во время ожидания,
то будет выброшено исключение InterruptedException, и флаг прерывания текущего потока будет сброшен.
Исключения:
InterruptedException - если текущий поток прерван во время ожидания

await

public boolean await(long timeout, TimeUnit unit) throws InterruptedException
Заставляет текущий поток ожидать, пока счётчик не уменьшится до нуля, если поток не был прерван или не истекло заданное время ожидания.

Если текущее значение count равно нулю, этот метод возвращается немедленно со значением true.

Если текущее значение count больше нуля, текущий поток отключается от планирования потоков и приостанавливается до тех пор, пока не произойдёт одно из трёх событий:

  • Значение count станет нулём в результате вызовов метода countDown(); или
  • Другой поток прерывает текущий поток; или
  • Истекает заданное время ожидания.

Если счётчик достигнет нуля, метод возвращает значение true.

Если в текущем потоке:

  • Флаг прерывания установлен при входе в этот метод; или
  • Поток прерывается во время ожидания,
то будет выброшено исключение InterruptedException, и флаг прерывания текущего потока будет сброшен.

Если заданное время ожидания истечёт, возвращается значение false. Если время равно или меньше нуля, метод не будет ожидать вообще.

Параметры:
timeout - максимальное время ожидания
unit - единица измерения времени для аргумента timeout
Возвращает:
true, если счётчик достиг нуля, и false, если время ожидания истекло, прежде чем счётчик достиг нуля
Исключения:
InterruptedException - если текущий поток прерван во время ожидания

countDown

public void countDown()
Уменьшает счётчик обратного отсчёта, освобождая все ожидающие потоки, если счётчик достигнет нуля.

Если текущее значение count больше нуля, оно уменьшается. Если новое значение count равно нулю, все ожидающие потоки снова активируются для планирования потоков.

Если текущее значение count равно нулю, ничего не происходит.

getCount

public long getCount()
Возвращает текущее значение count.

Этот метод обычно используется для отладки и тестирования.

Возвращает:
текущее значение count

toString

public String toString()
Возвращает строку, идентифицирующую этот счётчик, а также его состояние. Состояние, в скобках, включает строку "Count =", за которой следует текущее значение count.
Переопределяет:
toString в классе Object
Возвращает:
строку, идентифицирующую этот счётчик, а также его состояние

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/concurrent/CountDownLatch.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API