Spec-Zone.ru › OpenJDK 25

Класс CyclicBarrier

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

Объект CyclicBarrier поддерживает необязательную команду Runnable, которая выполняется один раз в каждой точке барьера — после прибытия последнего потока из группы, но до освобождения любых потоков. Это действие барьера полезно для обновления общего состояния до того, как участники продолжат работу.

Пример использования: Ниже показан пример использования барьера при параллельной декомпозиции:

class Solver {
  final int N;
  final float[][] data;
  final CyclicBarrier barrier;

  class Worker implements Runnable {
    int myRow;
    Worker(int row) { myRow = row; }
    public void run() {
      while (!done()) {
        processRow(myRow);

        try {
          barrier.await();
        } catch (InterruptedException ex) {
          return;
        } catch (BrokenBarrierException ex) {
          return;
        }
      }
    }
  }

  public Solver(float[][] matrix) {
    data = matrix;
    N = matrix.length;
    Runnable barrierAction = () -> mergeRows(...);
    barrier = new CyclicBarrier(N, barrierAction);

    List<Thread> threads = new ArrayList<>(N);
    for (int i = 0; i < N; i++) {
      Thread thread = new Thread(new Worker(i));
      threads.add(thread);
      thread.start();
    }

    // wait until done
    for (Thread thread : threads)
      try {
        thread.join();
      } catch (InterruptedException ex) { }
  }
}
Здесь каждый рабочий поток обрабатывает строку матрицы, а затем ожидает у барьера, пока не будут обработаны все строки. После обработки всех строк выполняется предоставленное действие барьера Runnable, объединяющее строки. Если объединяющий поток определит, что решение найдено, то done() вернет true, и каждый рабочий поток завершится.

Если действие барьера не зависит от того, приостановлены ли участники во время его выполнения, то при освобождении любой поток из группы может выполнить это действие. Для этого каждый вызов await() возвращает индекс прибытия данного потока к барьеру. Затем можно выбрать поток, который должен выполнить действие барьера, например:

if (barrier.await() == 0) {
  // log the completion of this iteration
}

В CyclicBarrier для неудачных попыток синхронизации используется модель отказа «все или ничего»: если поток покидает точку барьера преждевременно из-за прерывания, сбоя или истечения времени ожидания, все остальные потоки, ожидающие в этой точке барьера, также покидают ее аварийно, получая исключение BrokenBarrierException (или InterruptedException, если они тоже были прерваны примерно в то же время).

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

С момента версии:
1.5
См. также:
  • CountDownLatch
  • Phaser

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

Конструктор Описание
CyclicBarrier(int parties)
Создает новый объект CyclicBarrier, который срабатывает, когда на нем ожидает указанное количество участников (потоков), и не выполняет заранее заданное действие при срабатывании барьера.
CyclicBarrier(int parties, Runnable barrierAction)
Создает новый объект CyclicBarrier, который срабатывает, когда на нем ожидает указанное количество участников (потоков), и выполняет заданное действие барьера при его срабатывании. Действие выполняет последний поток, вошедший в барьер.

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

Модификатор и тип Метод Описание
int await()
Ожидает, пока все участники не вызовут await для этого барьера.
int await(long timeout, TimeUnit unit)
Ожидает, пока все участники не вызовут await для этого барьера или пока не истечет указанное время ожидания.
int getNumberWaiting()
Возвращает количество участников, в данный момент ожидающих у барьера.
int getParties()
Возвращает количество участников, необходимое для срабатывания этого барьера.
boolean isBroken()
Проверяет, находится ли этот барьер в сломанном состоянии.
void reset()
Сбрасывает барьер в исходное состояние.

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

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

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

CyclicBarrier

public CyclicBarrier(int parties, Runnable barrierAction)
Создает новый объект CyclicBarrier, который срабатывает, когда на нем ожидает указанное количество участников (потоков), и выполняет заданное действие барьера при его срабатывании. Действие выполняет последний поток, вошедший в барьер.
Параметры:
parties — количество потоков, которые должны вызвать await() до срабатывания барьера
barrierAction — команда, выполняемая при срабатывании барьера, или null, если действие не задано
Исключения:
IllegalArgumentException — если parties меньше 1

CyclicBarrier

public CyclicBarrier(int parties)
Создает новый объект CyclicBarrier, который срабатывает, когда на нем ожидает указанное количество участников (потоков), и не выполняет заранее заданное действие при срабатывании барьера.
Параметры:
parties — количество потоков, которые должны вызвать await() до срабатывания барьера
Исключения:
IllegalArgumentException — если parties меньше 1

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

getParties

public int getParties()
Возвращает количество участников, необходимое для срабатывания этого барьера.
Возвращает:
количество участников, необходимое для срабатывания этого барьера

await

public int await() throws InterruptedException, BrokenBarrierException
Ожидает, пока все участники не вызовут await для этого барьера.

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

  • Прибывает последний поток; или
  • Другой поток прерывает текущий поток; или
  • Другой поток прерывает один из других ожидающих потоков; или
  • Истекает время ожидания барьера у другого потока; или
  • Другой поток вызывает reset() для этого барьера.

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

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

Если барьер reset(), пока ожидает какой-либо поток, или если барьер сломанный в момент вызова await либо во время ожидания какого-либо потока, выбрасывается BrokenBarrierException.

Если какой-либо поток прерывается во время ожидания, все остальные ожидающие потоки получат исключение BrokenBarrierException, а барьер перейдет в сломанное состояние.

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

Возвращает:
индекс прибытия текущего потока, где индекс getParties() - 1 обозначает первый прибывший поток, а ноль — последний
Исключения:
InterruptedException — если текущий поток был прерван во время ожидания
BrokenBarrierException — если другой поток был прерван или у него истекло время ожидания, пока текущий поток ожидал, либо если барьер был сброшен или находился в сломанном состоянии при вызове await, либо если действие барьера (при его наличии) завершилось с исключением

await

public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException
Ожидает, пока все участники не вызовут await для этого барьера или пока не истечет указанное время ожидания.

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

  • Прибывает последний поток; или
  • Истекает указанное время ожидания; или
  • Другой поток прерывает текущий поток; или
  • Другой поток прерывает один из других ожидающих потоков; или
  • Истекает время ожидания барьера у другого потока; или
  • Другой поток вызывает reset() для этого барьера.

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

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

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

Если барьер reset(), пока ожидает какой-либо поток, или если барьер сломанный в момент вызова await либо во время ожидания какого-либо потока, выбрасывается BrokenBarrierException.

Если какой-либо поток прерывается во время ожидания, все остальные ожидающие потоки получат исключение BrokenBarrierException, а барьер перейдет в сломанное состояние.

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

Параметры:
timeout — время ожидания барьера
unit — единица измерения времени параметра тайм-аута
Возвращает:
индекс прибытия текущего потока, где индекс getParties() - 1 обозначает первый прибывший поток, а ноль — последний
Исключения:
InterruptedException — если текущий поток был прерван во время ожидания
TimeoutException — если истекает указанное время ожидания. В этом случае барьер будет сломан.
BrokenBarrierException — если другой поток был прерван или у него истекло время ожидания, пока текущий поток ожидал, либо если барьер был сброшен или находился в сломанном состоянии при вызове await, либо если действие барьера (при его наличии) завершилось с исключением

isBroken

public boolean isBroken()
Проверяет, находится ли этот барьер в сломанном состоянии.
Возвращает:
true, если один или несколько участников вышли из этого барьера из-за прерывания или истечения времени ожидания с момента создания барьера или последнего сброса либо если действие барьера завершилось с исключением; в противном случае — false.

reset

public void reset()
Сбрасывает барьер в исходное состояние. Если в данный момент у барьера ожидают участники, они вернутся с исключением BrokenBarrierException. Обратите внимание, что сброс после сбоя, произошедшего по другим причинам, может быть сложным: потокам необходимо повторно синхронизироваться каким-либо другим способом и выбрать поток, который выполнит сброс. Возможно, предпочтительнее создать новый барьер для дальнейшего использования.

getNumberWaiting

public int getNumberWaiting()
Возвращает количество участников, в данный момент ожидающих у барьера. Этот метод в первую очередь полезен для отладки и проверок.
Возвращает:
количество участников, в данный момент заблокированных в await()

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков с концептуальными обзорами, определениями терминов, обходными решениями и примерами работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/CyclicBarrier.html

Spec-Zone.ru

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