public interface Condition
Condition
因素的
Object
监测方法(
wait
,
notify
和
notifyAll
)为不同的对象给在每个对象的多个等待集的影响,结合
Lock
实现任意使用。在
Lock
取代
synchronized
方法和语句的使用,一个
Condition
取代对象监视器的使用方法。
条件(也被称为条件队列或条件变量)提供了一个手段,一个线程挂起执行(到“等待”),直到另一个线程通知,一些状态条件可能是真的。由于访问这个共享状态信息发生在不同的线程中,所以必须保护它,所以某些窗体的锁与条件相关联的。等待一个条件是,它提供了自动释放相关的锁和暂停当前线程的关键属性,就像Object.wait
。
一个Condition
实例本质上是绑定到一个锁。获得Condition
实例为一个特定的Lock
实例使用newCondition()
方法。
作为一个例子,假设我们有一个有界缓冲区支持put
和take
方法。如果一个take
试图在一个空缓冲区,则线程将被阻塞,直到一个项目就可以;如果put
试图在全缓冲,然后该线程将被阻塞,直到空间可用。我们愿意继续等待put
线程和线程组take
分离等使我们可以只使用通知单线程的时候,物品或空间成为可用的缓冲区中的优化。这可通过两个Condition
实例实现。
类boundedbuffer {最后锁=新reentrantlock();最后的条件不充分,newcondition()锁;最后一个条件newcondition()锁;空=最终对象[ ]项目=新的对象[ 100 ];国际putptr,takeptr,计数;公共无效投入(对象x)抛出InterruptedException {lock()锁;尝试{虽然(计数=项目。长度)await()不充分;项目[ putptr ] = x;如果(+ + putptr = =项目。长度)putptr = 0;+ +计数;signal()空;最后,{ }unlock()锁;}}公共对象take()抛出InterruptedException {lock()锁;尝试{虽然(计数= = 0)await()空;对象x =项目[ takeptr ];如果(+ + takeptr = =项目。长度)takeptr = 0;——计数;signal()不充分;返回x;最后,{ }unlock()锁;}}}(的
ArrayBlockingQueue
类提供了这个功能,所以没有理由实施这类样品的使用。)
一个Condition
实现可以提供行为和语义是不同的Object
监测方法,如保证订货通知,或不需要锁举行表演时通知。如果一个实现提供了这样的专门的语义,那么这些语义的实现必须记录这些语义。
注意,Condition
实例仅仅是普通的对象,也可以被用来作为目标在synchronized
语句,可以有自己的监控wait
和notification
调用的方法。获取一个Condition
实例监控锁,或利用其监测方法,没有特定关系获取,Condition
或其waiting和signalling方法的使用相关的Lock
。这是建议,为了避免混淆,你这样没用Condition
实例,也许除了在自己的实现。
除特别注明外,传递任何参数null
值将导致NullPointerException
抛出。
当等候一Condition
,“虚假唤醒”是允许发生的,在一般情况下,作为底层平台语义让步。这对大多数应用程序作为一个Condition
什么实际影响应该等着在一个循环中,测试状态谓词,正在等待。一个实现自由删除虚假唤醒的可能性,但建议应用程序员总是认为他们可以发生的,所以总是等在一个回路。
三种情况等(可中断,不可中断,定时)可能会有不同的易于实施的一些平台和性能特点。特别是,它可能是难以提供这些功能,并保持特定的语义,如订购担保。此外,中断线程的实际暂停的能力可能并不总是可行的,在所有平台上实现。
因此,一个实现是不需要定义完全相同的保证或语义的所有三种形式的等待,也不是需要支持中断的线程的实际暂停。
一个实现是需要清楚地记录每一个等待方法提供的语义和保证,当一个实现不支持线程中断的中断,那么它必须服从中断语义定义在这个接口。
由于中断通常意味着取消,和检查中断往往是罕见的,一个实现可以有利于响应一个中断,在正常的方法返回。即使能够证明中断发生另一个动作,可能有畅通的线后,这是真的。一个实现应该记录这种行为。
Modifier and Type | Method and Description |
---|---|
void |
await()
使当前线程等待它暗示或
interrupted。
|
boolean |
await(long time, TimeUnit unit)
使当前线程等待信号或中断,或指定的等待时间的流逝。
|
long |
awaitNanos(long nanosTimeout)
使当前线程等待信号或中断,或指定的等待时间的流逝。
|
void |
awaitUninterruptibly()
导致当前线程等待,直到它被发出信号。
|
boolean |
awaitUntil(Date deadline)
使当前线程等待信号或中断,或指定的期限结束。
|
void |
signal()
唤醒一个等待线程。
|
void |
signalAll()
唤醒所有等待线程。
|
void await() throws InterruptedException
这Condition
关联的锁是原子释放当前线程的线程调度的目的成为残疾人和处于休眠状态,直到四个事情发生:
Condition
的signal()
方法和当前线程会被选为被唤醒的线程;或Condition
的signalAll()
法;或在所有情况下,在此方法之前,可以返回当前线程必须重新获得与此条件相关联的锁。当线程返回时,它保证保持这个锁。
如果当前线程:
InterruptedException
投入和当前线程的中断状态被清除。它没有被指定,在第一种情况下,是否中断测试之前发生的锁被释放。
实施的思考
当前线程假设持有这Condition
关联的锁时,调用此方法。它是由执行,以确定是否是这样的情况下,如果没有,如何回应。通常,将抛出一个异常(如IllegalMonitorStateException
)和实施必须证明的事实。
实现可以有利于响应于响应于一个信号的正常方法返回的中断。在这种情况下,执行必须确保信号被重定向到另一个等待线程,如果有一个。
InterruptedException
-如果当前线程被中断(和线程挂起中断的支持)
void awaitUninterruptibly()
与此条件相关的锁是原子释放当前线程的线程调度的目的成为残疾人和处于休眠状态,直到三个事情发生:
Condition
的signal()
方法和当前线程会被选为被唤醒的线程;或Condition
的signalAll()
法;或在所有情况下,在此方法之前,可以返回当前线程必须重新获得与此条件相关联的锁。当线程返回时,它保证保持这个锁。
如果当前线程的中断状态设置当它进入这个方法,或是interrupted而等待,继续等待信号。当它最后从该方法返回时,它的中断状态仍然会被设置。
实施的思考
当前线程假设持有这Condition
关联的锁时,调用此方法。它是由执行,以确定是否是这样的情况下,如果没有,如何回应。通常,将抛出一个异常(如IllegalMonitorStateException
)和实施必须证明的事实。
long awaitNanos(long nanosTimeout) throws InterruptedException
与此条件相关的锁是原子释放当前线程的线程调度的目的成为残疾人和处于休眠状态,直到五个事情发生:
Condition
的signal()
方法和当前线程会被选为被唤醒的线程;或Condition
的signalAll()
法;或在所有情况下,在此方法之前,可以返回当前线程必须重新获得与此条件相关联的锁。当线程返回时,它保证保持这个锁。
如果当前线程:
InterruptedException
投入和当前线程的中断状态被清除。它没有被指定,在第一种情况下,是否中断测试之前发生的锁被释放。
方法返回给定剩余等提供的nanosTimeout
值返回后纳秒数估计,或值小于或等于零,如果超时。此值可以被用来确定是否以及如何在等待等待返回的情况下,等待等待,但等待等待的条件仍然没有举行。此方法的典型用途采取以下形式:
boolean aMethod(long timeout, TimeUnit unit) {
long nanos = unit.toNanos(timeout);
lock.lock();
try {
while (!conditionBeingWaitedFor()) {
if (nanos <= 0L)
return false;
nanos = theCondition.awaitNanos(nanos);
}
// ...
} finally {
lock.unlock();
}
}
设计说明:这种方法需要一个纳秒级的参数,以避免在报告剩余时间截断误差。这样的精度损失将使它难以为程序员,以确保总的等待时间不系统地短于指定的重新等待时发生。
实施的思考
当前线程假设持有这Condition
关联的锁时,调用此方法。它是由执行,以确定是否是这样的情况下,如果没有,如何回应。通常,将抛出一个异常(如IllegalMonitorStateException
)和实施必须证明的事实。
实施有利于应对中断正常的方法返回响应信号,或指示指定的等待时间的流逝。在这两种情况下,执行必须确保信号被重定向到另一个等待线程,如果有一个。
nanosTimeout
的最大等待时间,在纳秒
nanosTimeout
价值减去时间等候从这个方法返回。一个正值可以用来作为参数,以对这种方法的后续调用,以完成等待所需的时间。一个小于或等于零的值表示没有时间保持。
InterruptedException
-如果当前线程被中断(和线程挂起中断的支持)
boolean await(long time, TimeUnit unit) throws InterruptedException
awaitNanos(unit.toNanos(time)) > 0
time
-最大等待时间
unit
的
time
争论的时间单位
false
如果等待的时间检测到才从方法返回,否则
true
InterruptedException
-如果当前线程被中断(和线程挂起中断的支持)
boolean awaitUntil(Date deadline) throws InterruptedException
与此条件相关的锁是原子释放当前线程的线程调度的目的成为残疾人和处于休眠状态,直到五个事情发生:
Condition
的signal()
方法和当前线程会被选为被唤醒的线程;或Condition
的signalAll()
法;或在所有情况下,在此方法之前,可以返回当前线程必须重新获得与此条件相关联的锁。当线程返回时,它保证保持这个锁。
如果当前线程:
InterruptedException
投入和当前线程的中断状态被清除。它没有被指定,在第一种情况下,是否中断测试之前发生的锁被释放。
返回值指示是否已过的最后期限,可以使用如下:
boolean aMethod(Date deadline) {
boolean stillWaiting = true;
lock.lock();
try {
while (!conditionBeingWaitedFor()) {
if (!stillWaiting)
return false;
stillWaiting = theCondition.awaitUntil(deadline);
}
// ...
} finally {
lock.unlock();
}
}
实施的思考
当前线程假设持有这Condition
关联的锁时,调用此方法。它是由执行,以确定是否是这样的情况下,如果没有,如何回应。通常,将抛出一个异常(如IllegalMonitorStateException
)和实施必须证明的事实。
一个实现可以有利于响应一个中断,在正常的方法返回响应于一个信号,或超过表示指定的最后期限的通过。在这两种情况下,执行必须确保信号被重定向到另一个等待线程,如果有一个。
deadline
-等到绝对时间
false
如果最后期限已过返回后,其他
true
InterruptedException
-如果当前线程被中断(和线程挂起中断的支持)
void signal()
如果任何线程都在等待这个条件,然后选择一个唤醒。该线程必须重新获取锁在await
归来。
实施的思考
一个实现可能(通常如此)要求当前线程持有该Condition
关联的锁时,调用此方法。实现必须记录此前提条件和采取的任何行动,如果锁不举行。通常,一个异常如IllegalMonitorStateException
将抛出。
void signalAll()
如果有任何线程在等待这个条件,那么他们都被唤醒了。每个线程必须重新获取锁才可以回到await
。
实施的思考
一个实现可能(通常如此)要求当前线程持有该Condition
关联的锁时,调用此方法。实现必须记录此前提条件和采取的任何行动,如果锁不举行。通常,一个异常如IllegalMonitorStateException
将抛出。
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.