Класс CyclicBarrier
public class CyclicBarrier extends Object
Объект 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
- См. также:
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
CyclicBarrier |
Создает новый объект CyclicBarrier, который срабатывает, когда на нем ожидает указанное количество участников (потоков), и не выполняет заранее заданное действие при срабатывании барьера. |
CyclicBarrier |
Создает новый объект CyclicBarrier, который срабатывает, когда на нем ожидает указанное количество участников (потоков), и выполняет заданное действие барьера при его срабатывании. Действие выполняет последний поток, вошедший в барьер. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
int |
await() |
Ожидает, пока все участники не вызовут await для этого барьера. |
int |
await |
Ожидает, пока все участники не вызовут await для этого барьера или пока не истечет указанное время ожидания. |
int |
getNumberWaiting() |
Возвращает количество участников, в данный момент ожидающих у барьера. |
int |
getParties() |
Возвращает количество участников, необходимое для срабатывания этого барьера. |
boolean |
isBroken() |
Проверяет, находится ли этот барьер в сломанном состоянии. |
void |
reset() |
Сбрасывает барьер в исходное состояние. |
Подробное описание конструкторов
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()
© 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