ICondition 接口
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
Condition
Object
将监视器方法 (Object#wait() wait
Object#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() wait
Object#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()
方法。
例如,假设我们有一个支持 put
和 take
方法的边界缓冲区。 take
如果在空缓冲区上尝试了 ,则线程将阻塞,直到项变得可用;如果在put
完整缓冲区上尝试了 ,则线程将阻塞,直到有可用空间。 我们希望将等待 put
线程和 take
线程保留在单独的等待集中,以便我们可以使用优化,即在缓冲区中的项或空间可用时仅通知单个线程。 这可以使用两个 Condition
实例来实现。
class BoundedBuffer<E> {
<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>虚假唤醒</em>"通常允许发生,作为对基础平台语义的让步。 这对大多数应用程序几乎没有实际影响, Condition
因为 应始终在循环中等待,从而测试正在等待的状态谓词。 实现可以自由消除虚假唤醒的可能性,但建议应用程序程序员始终假设它们可能发生,因此始终在循环中等待。
等待条件的三种形式 (可中断、不可中断和定时) 在某些平台上的易实现性及其性能特征方面可能有所不同。 具体而言,提供这些功能和维护特定语义(如排序保证)可能很困难。 此外,中断线程实际挂起的功能可能并非总是在所有平台上都可行。
因此,实现不需要为所有三种等待形式定义完全相同的保证或语义,也不需要支持线程实际挂起的中断。
实现需要清楚地记录每个等待方法提供的语义和保证,当实现确实支持线程挂起中断时,它必须遵循此接口中定义的中断语义。
由于中断通常意味着取消,并且通常不常检查中断,因此实现可以倾向于响应中断,而不适用于正常方法返回。 即使可以显示中断发生在另一个可能已解除阻止线程的操作之后,也是如此。 实现应记录此行为。
在 1.5 中添加。
的 java.util.concurrent.locks.Condition
Java 文档。
此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。
属性
Handle |
获取基础 Android 对象的 JNI 值。 (继承自 IJavaObject) |
JniIdentityHashCode |
返回包装实例的 的值 |
JniManagedPeerState |
托管对等方的状态。 (继承自 IJavaPeerable) |
JniPeerMembers |
成员访问和调用支持。 (继承自 IJavaPeerable) |
PeerReference |
返回 JniObjectReference 包装的 Java 对象实例的 。 (继承自 IJavaPeerable) |
方法
Await() |
导致当前线程等待,直到发出信号或线程#中断中断。 |
Await(Int64, TimeUnit) |
导致当前线程等待,直到发出信号或中断,或者指定的等待时间已过。 |
AwaitNanos(Int64) |
导致当前线程等待,直到发出信号或中断,或者指定的等待时间已过。 |
AwaitUninterruptibly() |
导致当前线程等待,直到发出信号。 |
AwaitUntil(Date) |
导致当前线程等待,直到发出信号或中断,或者指定的截止时间已过。 |
Disposed() |
在释放实例时调用。 (继承自 IJavaPeerable) |
DisposeUnlessReferenced() |
如果没有对此实例的未完成引用,则调用 |
Finalized() |
在实例完成时调用。 (继承自 IJavaPeerable) |
SetJniIdentityHashCode(Int32) |
设置 返回 |
SetJniManagedPeerState(JniManagedPeerStates) |
|
SetPeerReference(JniObjectReference) |
设置 返回 |
Signal() |
唤醒一个等待的线程。 |
SignalAll() |
唤醒所有等待的线程。 |
UnregisterFromRuntime() |
取消注册此实例,以便运行时不会从将来 Java.Interop.JniRuntime+JniValueManager.PeekValue 的调用中返回它。 (继承自 IJavaPeerable) |
扩展方法
JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
JavaCast<TResult>(IJavaObject) |
|
GetJniTypeName(IJavaPeerable) |
|