CyclicBarrier Класс

Определение

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

[Android.Runtime.Register("java/util/concurrent/CyclicBarrier", DoNotGenerateAcw=true)]
public class CyclicBarrier : Java.Lang.Object
[<Android.Runtime.Register("java/util/concurrent/CyclicBarrier", DoNotGenerateAcw=true)>]
type CyclicBarrier = class
    inherit Object
Наследование
CyclicBarrier
Атрибуты

Комментарии

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

Поддерживает CyclicBarrier необязательную Runnable команду, которая выполняется один раз для каждой точки барьера после поступления последнего потока в стороне, но до освобождения потоков. Это <действие< барьера> em>полезно для обновления общего состояния до того, как какая-либо из сторон продолжит работу.

<b>Пример использования:</b> Ниже приведен пример использования барьера в структуре параллельного декомпозиции:

{@code
            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 возвращает индекс поступления этого потока на барьере. Затем можно выбрать поток, который должен выполнять действие барьера, например:

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

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

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

Добавлено в версии 1.5.

Документация по Java для java.util.concurrent.CyclicBarrier.

Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом Android и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License.

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

CyclicBarrier(Int32)

Создает новый CyclicBarrier объект, который будет спотыкаться, когда заданное количество сторон (потоков) ожидает его, и не выполняет предопределенное действие при спотыке барьера.

CyclicBarrier(Int32, IRunnable)

Создает новый CyclicBarrier объект , который будет спотыкаться, когда заданное количество сторон (потоков) ожидает его, и который будет выполнять заданное действие барьера при спотыке барьера, выполненное последним потоком, входящим в барьер.

CyclicBarrier(IntPtr, JniHandleOwnership)

Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения.

Свойства

Class

Возвращает класс среды выполнения данного объекта Object.

(Унаследовано от Object)
Handle

Дескриптор базового экземпляра Android.

(Унаследовано от Object)
IsBroken

Запрашивает, находится ли этот барьер в неисправном состоянии.

JniIdentityHashCode

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

(Унаследовано от Object)
JniPeerMembers

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

NumberWaiting

Возвращает количество сторон, ожидающих в настоящее время на барьере.

Parties

Возвращает количество сторон, необходимых для этого барьера.

PeerReference

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

(Унаследовано от Object)
ThresholdClass

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

ThresholdType

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

Методы

Await()

Ожидает, пока все #getParties стороны не вызовуют await этот барьер.

Await(Int64, TimeUnit)

Ожидает, пока все #getParties стороны не вызовет await этот барьер или не истедет указанное время ожидания.

AwaitAsync()

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

AwaitAsync(Int64, TimeUnit)

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

Clone()

Создает и возвращает копию этого объекта.

(Унаследовано от Object)
Dispose()

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

(Унаследовано от Object)
Dispose(Boolean)

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

(Унаследовано от Object)
Equals(Object)

Указывает, равен ли какой-то другой объект этому объекту.

(Унаследовано от Object)
GetHashCode()

Возвращает значение хэш-кода для объекта.

(Унаследовано от Object)
JavaFinalize()

Вызывается сборщиком мусора для объекта , когда сборка мусора определяет, что больше нет ссылок на объект .

(Унаследовано от Object)
Notify()

Пробуждает один поток, ожидающий монитора этого объекта.

(Унаследовано от Object)
NotifyAll()

Пробуждает все потоки, ожидающие на мониторе этого объекта.

(Унаследовано от Object)
Reset()

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

SetHandle(IntPtr, JniHandleOwnership)

Задает свойство Handle.

(Унаследовано от Object)
ToArray<T>()

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

(Унаследовано от Object)
ToString()

Возвращает строковое представление объекта.

(Унаследовано от Object)
UnregisterFromRuntime()

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

(Унаследовано от Object)
Wait()

Вызывает ожидание текущего потока, пока он не пробудится, как правило, из-за <уведомления><<> или>прерывания или прерывания.><

(Унаследовано от Object)
Wait(Int64)

Вызывает ожидание текущего потока, пока он не пробудится, как правило, путем <уведомления><<> или>прерывания или прерывания<> или до истечения определенного количества реального времени.

(Унаследовано от Object)
Wait(Int64, Int32)

Вызывает ожидание текущего потока, пока он не пробудится, как правило, путем <уведомления><<> или>прерывания или прерывания<> или до истечения определенного количества реального времени.

(Унаследовано от Object)

Явные реализации интерфейса

IJavaPeerable.Disposed()

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

(Унаследовано от Object)
IJavaPeerable.DisposeUnlessReferenced()

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

(Унаследовано от Object)
IJavaPeerable.Finalized()

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

(Унаследовано от Object)
IJavaPeerable.JniManagedPeerState

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

(Унаследовано от Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

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

(Унаследовано от Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

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

(Унаследовано от Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

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

(Унаследовано от Object)

Методы расширения

JavaCast<TResult>(IJavaObject)

Выполняет преобразование типа, проверенного средой выполнения Android.

JavaCast<TResult>(IJavaObject)

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

GetJniTypeName(IJavaPeerable)

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

Применяется к