Spec-Zone.ru › OpenJDK 8

Класс CyclicBarrier

  • java.lang.Object
    • java.util.concurrent.CyclicBarrier

public class CyclicBarrier
extends Object

Средство синхронизации, позволяющее набору потоков ожидать друг друга до достижения общей точки барьера. CyclicBarriers полезны в программах, включающих фиксированный набор потоков, которым периодически необходимо ждать друг друга. Барьер называется циклическим, потому что он может быть повторно использован после освобождения ожидающих потоков.

A 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 =
       new Runnable() { public void run() { mergeRows(...); }};
     barrier = new CyclicBarrier(N, barrierAction);

     List<Thread> threads = new ArrayList<Thread>(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)
       thread.join();
   }
 }
Здесь каждый рабочий поток обрабатывает строку матрицы, а затем ожидает у барьера, пока все строки не будут обработаны. Когда все строки обработаны, заданное действие барьера Runnable выполняется и строки объединяются. Если объединитель определит, что решение найдено, то done() вернёт true и каждый рабочий поток завершится.

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

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

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

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

С:
1.5
См. также:
CountDownLatch

Конструкторы

Конструктор и описание
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()

Сбрасывает барьер в исходное состояние.

Методы, унаследованные от класса java.lang.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()

© 1993, 2020, 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.

Spec-Zone.ru

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