ICondition Интерфейс

Определение

Condition Object факторы из методов монитора (Object#wait() waitObject#notify notifyиObject#notifyAll notifyAll) в отдельные объекты, чтобы обеспечить эффект наличия нескольких наборов ожидания для каждого объекта, сочетая их с использованием произвольных Lock реализаций.

[Android.Runtime.Register("java/util/concurrent/locks/Condition", "", "Java.Util.Concurrent.Locks.IConditionInvoker")]
public interface ICondition : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/util/concurrent/locks/Condition", "", "Java.Util.Concurrent.Locks.IConditionInvoker")>]
type ICondition = interface
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
Производный
Атрибуты
Реализации

Комментарии

Condition Object факторы из методов монитора (Object#wait() waitObject#notify notifyиObject#notifyAll notifyAll) в отдельные объекты, чтобы обеспечить эффект наличия нескольких наборов ожидания для каждого объекта, сочетая их с использованием произвольных Lock реализаций. Когда методы Lock и инструкции заменяются synchronized использованием методов и инструкций, Condition вместо использования методов монитора объектов.

Условия (также известные как <очереди> условий em</em> или <em-переменные></em>) предоставляют средства для одного потока для приостановки выполнения (в " wait") до уведомления другого потока о том, что некоторое условие состояния теперь может быть истинным. Так как доступ к этой общей информации о состоянии происходит в разных потоках, он должен быть защищен, поэтому блокировка какой-то формы связана с условием. Ключевое свойство, ожидающее условия, заключается в том, что он <атомарно></em> освобождает связанную блокировку и приостанавливает текущий поток, как Object.waitи .

Condition Экземпляр внутренне привязан к блокировке. Чтобы получить Condition экземпляр для конкретного Lock экземпляра, используйте его Lock#newCondition newCondition() метод.

Предположим, что у нас есть ограниченный буфер, который поддерживает put и take методы. take Если попытка выполнить попытку в пустом буфере, поток будет блокироваться до тех пор, пока элемент не станет доступным; если put попытка выполнить попытку в полном буфере, поток будет блокироваться до тех пор, пока пространство не станет доступным. Мы хотели бы сохранить ожидающие put потоки и take потоки в отдельных наборах ожидания, чтобы мы могли использовать оптимизацию только уведомления одного потока в то время, когда элементы или пробелы становятся доступными в буфере. Это можно сделать с помощью двух Condition экземпляров.

class BoundedBuffer&lt;E&gt; {
<b>final Lock lock = new ReentrantLock();</b>
              final Condition notFull  = <b>lock.newCondition(); </b>
              final Condition notEmpty = <b>lock.newCondition(); </b>

              final Object[] items = new Object[100];
              int putptr, takeptr, count;

              public void put(E x) throws InterruptedException {
<b>lock.lock();
                try {</b>
                  while (count == items.length)
<b>notFull.await();</b>
                  items[putptr] = x;
                  if (++putptr == items.length) putptr = 0;
                  ++count;
<b>notEmpty.signal();</b>
<b>} finally {
                  lock.unlock();
                }</b>
              }

              public E take() throws InterruptedException {
<b>lock.lock();
                try {</b>
                  while (count == 0)
<b>notEmpty.await();</b>
                  E x = (E) items[takeptr];
                  if (++takeptr == items.length) takeptr = 0;
                  --count;
<b>notFull.signal();</b>
                  return x;
<b>} finally {
                  lock.unlock();
                }</b>
              }
            }

(Класс java.util.concurrent.ArrayBlockingQueue предоставляет эту функциональность, поэтому нет причин для реализации этого примера класса использования.)

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

Обратите внимание, что Condition экземпляры являются просто обычными объектами и сами могут использоваться в качестве целевого synchronized объекта в инструкции, и могут вызывать собственный монитор Object#wait wait и Object#notify notify методы. Получение блокировки монитора экземпляра Condition или его методов мониторинга не имеет указанных отношений с получением Lock связанного с ним Condition или использования его #await ожиданий и #signal сигнальных методов. Рекомендуется избежать путаницы, которую никогда не использовать Condition экземпляры таким образом, за исключением, возможно, в рамках собственной реализации.

За исключением того, где указано, передача null значения для любого параметра приведет к возникновению NullPointerException ошибки.

<Рекомендации по> реализации h2</h2>

При ожидании Condition, "<В>целом, в качестве уступки базовой семантике платформы разрешено возникать фиктивное пробуждение</em>" в целом. Это мало влияет на большинство программ приложений, так как Condition всегда следует ожидать в цикле, тестирование предиката состояния, которое ожидается. Реализация является бесплатной, чтобы удалить возможность спрогнозных пробуждений, но рекомендуется, чтобы программисты приложений всегда предполагали, что они могут возникать и поэтому всегда ждать в цикле.

Три формы ожидания условий (прерываемые, не прерываемые и время ожидания) могут отличаться в их простоте реализации на некоторых платформах и в их характеристике производительности. В частности, может быть трудно предоставить эти функции и поддерживать определенную семантику, например гарантии упорядочивания. Кроме того, возможность прерывания фактической приостановки потока может не всегда быть возможной для реализации на всех платформах.

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

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

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

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

Java документации по java.util.concurrent.locks.Condition.

Части этой страницы — это изменения на основе работы, созданной и общей Project и используемых в соответствии с условиями, описанными в разделе "".

Свойства

Имя Описание
Handle

Возвращает значение JNI базового объекта Android.

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

Возвращает значение java.lang.System.identityHashCode() для упаковаемого экземпляра.

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

Состояние управляемого однорангового узла.

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

Поддержка доступа к членам и вызовов.

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

JniObjectReference Возвращает экземпляр объекта Java в оболочке.

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

Методы

Имя Описание
Await()

Вызывает ожидание текущего потока до тех пор, пока он не будет сигнализировать или прервать прерывание Thread#.

Await(Int64, TimeUnit)

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

AwaitNanos(Int64)

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

AwaitUninterruptibly()

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

AwaitUntil(Date)

Вызывает ожидание текущего потока, пока он не будет сигнален или прерван, или указанный крайний срок истекает.

Disposed()

Вызывается при удалении экземпляра.

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

Если нет невыполненных ссылок на этот экземпляр, то вызывается Dispose(); в противном случае ничего не делает.

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

Вызывается при завершении экземпляра.

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

Задайте значение, возвращаемое JniIdentityHashCode.

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

Condition Object факторы из методов монитора (Object#wait() waitObject#notify notifyиObject#notifyAll notifyAll) в отдельные объекты, чтобы обеспечить эффект наличия нескольких наборов ожидания для каждого объекта, сочетая их с использованием произвольных Lock реализаций.

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

Задайте значение, возвращаемое PeerReference.

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

Просыпается один поток ожидания.

SignalAll()

Просыпается все потоки ожидания.

UnregisterFromRuntime()

Отмените регистрацию этого экземпляра, чтобы среда выполнения не возвращала ее из будущих Java.Interop.JniRuntime+JniValueManager.PeekValue вызовов.

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

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

Имя Описание
GetJniTypeName(IJavaPeerable)

Возвращает имя JNI типа экземпляра self.

JavaAs<TResult>(IJavaPeerable)

Попробуйте принуждать к типуself, проверяяTResult, является ли приведение допустимым на стороне Java.

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

Condition Object факторы из методов монитора (Object#wait() waitObject#notify notifyиObject#notifyAll notifyAll) в отдельные объекты, чтобы обеспечить эффект наличия нескольких наборов ожидания для каждого объекта, сочетая их с использованием произвольных Lock реализаций.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Попробуйте принуждать к типуself, проверяяTResult, является ли приведение допустимым на стороне Java.

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