ICondition 接口

定义

ConditionObject将监视器方法 (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
派生
属性
实现

注解

ConditionObject将监视器方法 (Object#wait() waitObject#notify notify,并将 Object#notifyAll notifyAll) 到不同的对象中,通过将它们与任意Lock实现结合使用,为每个对象提供多个等待集的效果。 其中 替换 Lock 了方法和 语句的使用 synchronized ,而 Condition 使用 对象监视器方法。

条件 (也称为 <em>condition queues</em> 或 <em>condition variables</em>) 为一个线程提供了暂停执行的方法, ("等待") ,直到另一个线程通知某些状态条件现在可能为 true。 由于访问此共享状态信息发生在不同的线程中,因此必须对其进行保护,因此某种形式的锁与条件相关联。 等待条件提供的键属性是,它<>以原子方式<释放>关联的锁并挂起当前线程,就像 一样Object.wait

实例 Condition 本质上绑定到锁。 若要获取 Condition 特定 Lock 实例的 实例,请使用其 Lock#newCondition newCondition() 方法。

例如,假设我们有一个支持 puttake 方法的边界缓冲区。 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 waitObject#notify notify 方法。 获取实例的 Condition 监视器锁或使用其监视方法与获取 Lock 与该 Condition 实例关联的 或使用其 #await 等待和 #signal 信号方法没有指定关系。 为避免混淆,建议永远不要以这种方式使用 Condition 实例,除非是在它们自己的实现中。

除非另有指出,否则 null 为任何参数传递值都将导致 NullPointerException 引发 。

<h2>实现注意事项</h2>

在等待 Condition时,&商;<em>虚假唤醒</em>"通常允许发生,作为对基础平台语义的让步。 这对大多数应用程序几乎没有实际影响, Condition 因为 应始终在循环中等待,从而测试正在等待的状态谓词。 实现可以自由消除虚假唤醒的可能性,但建议应用程序程序员始终假设它们可能发生,因此始终在循环中等待。

等待条件的三种形式 (可中断、不可中断和定时) 在某些平台上的易实现性及其性能特征方面可能有所不同。 具体而言,提供这些功能和维护特定语义(如排序保证)可能很困难。 此外,中断线程实际挂起的功能可能并非总是在所有平台上都可行。

因此,实现不需要为所有三种等待形式定义完全相同的保证或语义,也不需要支持线程实际挂起的中断。

实现需要清楚地记录每个等待方法提供的语义和保证,当实现确实支持线程挂起中断时,它必须遵循此接口中定义的中断语义。

由于中断通常意味着取消,并且通常不常检查中断,因此实现可以倾向于响应中断,而不适用于正常方法返回。 即使可以显示中断发生在另一个可能已解除阻止线程的操作之后,也是如此。 实现应记录此行为。

在 1.5 中添加。

java.util.concurrent.locks.ConditionJava 文档。

此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。

属性

Handle

获取基础 Android 对象的 JNI 值。

(继承自 IJavaObject)
JniIdentityHashCode

返回包装实例的 的值 java.lang.System.identityHashCode()

(继承自 IJavaPeerable)
JniManagedPeerState

托管对等方的状态。

(继承自 IJavaPeerable)
JniPeerMembers

成员访问和调用支持。

(继承自 IJavaPeerable)
PeerReference

返回 JniObjectReference 包装的 Java 对象实例的 。

(继承自 IJavaPeerable)

方法

Await()

导致当前线程等待,直到发出信号或线程#中断中断。

Await(Int64, TimeUnit)

导致当前线程等待,直到发出信号或中断,或者指定的等待时间已过。

AwaitNanos(Int64)

导致当前线程等待,直到发出信号或中断,或者指定的等待时间已过。

AwaitUninterruptibly()

导致当前线程等待,直到发出信号。

AwaitUntil(Date)

导致当前线程等待,直到发出信号或中断,或者指定的截止时间已过。

Disposed()

在释放实例时调用。

(继承自 IJavaPeerable)
DisposeUnlessReferenced()

如果没有对此实例的未完成引用,则调用 Dispose();否则不执行任何操作。

(继承自 IJavaPeerable)
Finalized()

在实例完成时调用。

(继承自 IJavaPeerable)
SetJniIdentityHashCode(Int32)

设置 返回 JniIdentityHashCode的值。

(继承自 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

ConditionObject将监视器方法 (Object#wait() waitObject#notify notify,并将 Object#notifyAll notifyAll) 到不同的对象中,通过将它们与任意Lock实现结合使用,为每个对象提供多个等待集的效果。

(继承自 IJavaPeerable)
SetPeerReference(JniObjectReference)

设置 返回 PeerReference的值。

(继承自 IJavaPeerable)
Signal()

唤醒一个等待的线程。

SignalAll()

唤醒所有等待的线程。

UnregisterFromRuntime()

取消注册此实例,以便运行时不会从将来 Java.Interop.JniRuntime+JniValueManager.PeekValue 的调用中返回它。

(继承自 IJavaPeerable)

扩展方法

JavaCast<TResult>(IJavaObject)

执行 Android 运行时检查的类型转换。

JavaCast<TResult>(IJavaObject)

ConditionObject将监视器方法 (Object#wait() waitObject#notify notify,并将 Object#notifyAll notifyAll) 到不同的对象中,通过将它们与任意Lock实现结合使用,为每个对象提供多个等待集的效果。

GetJniTypeName(IJavaPeerable)

ConditionObject将监视器方法 (Object#wait() waitObject#notify notify,并将 Object#notifyAll notifyAll) 到不同的对象中,通过将它们与任意Lock实现结合使用,为每个对象提供多个等待集的效果。

适用于