public class LockSupport extends Object
这类员工,每一个线程使用,许可证(在Semaphore
阶级意识)。一个叫park
如果允许可立即返回,消耗的过程;否则可能会阻止。一个叫unpark
使可用的许可,如果不是已经可用。(与信号量虽然允许不积累。有至多一个。)
方法park
和unpark
提供查封和解封的线程不会遇到导致过时的方法Thread.suspend
和Thread.resume
无法使用等目的的问题的有效手段:一个线程调用park
和另一个线程试图unpark
将保持活性的种族之间,由于许可证。此外,park
如果调用者的线程被中断返回,并暂停版本都支持。的park
方法也可以在其他任何时间的回报,“没有理由”,所以一般必须在一个循环调用返回时复核条件。在这个意义上park
作为“忙等待”,不多浪费时间纺优化,但必须是成对的unpark
是有效的。
三种形式的park
每个还支持blocker
对象参数。此对象被记录,而线程被阻塞,以允许监视和诊断工具,以确定线程被阻塞的原因。(这样的工具可以使用方法getBlocker(Thread)
。受体阻滞剂)这些形式的使用,而不是没有这个参数的原始形式是大力鼓励。提供在锁实现this
blocker
是正常的争论。
这些方法被设计为用于创建更高级别的同步工具的工具,而不是在自己有用的大多数并发控制应用。的park
方法设计只使用在表单的结构:
while (!canProceed()) { ... LockSupport.park(this); }
没有
canProceed
或任何其他行动之前调用
park
需要锁定或阻塞。因为只有一个许可证是每个线程相关,任何中介利用
park
可能影响预期的效果。
示例用法。这里是一个先入先出不可重入锁类素描:
class FIFOMutex {
private final AtomicBoolean locked = new AtomicBoolean(false);
private final Queue<Thread> waiters
= new ConcurrentLinkedQueue<Thread>();
public void lock() {
boolean wasInterrupted = false;
Thread current = Thread.currentThread();
waiters.add(current);
// Block while not first in queue or cannot acquire lock
while (waiters.peek() != current ||
!locked.compareAndSet(false, true)) {
LockSupport.park(this);
if (Thread.interrupted()) // ignore interrupts while waiting
wasInterrupted = true;
}
waiters.remove();
if (wasInterrupted) // reassert interrupt status on exit
current.interrupt();
}
public void unlock() {
locked.set(false);
LockSupport.unpark(waiters.peek());
}
}
Modifier and Type | Method and Description |
---|---|
static Object |
getBlocker(Thread t)
返回给一个尚未畅通公园最近的方法调用模型对象,或空如果不堵塞。
|
static void |
park()
禁用当前线程的线程调度的目的,除非许可证是可用的。
|
static void |
park(Object blocker)
禁用当前线程的线程调度的目的,除非许可证是可用的。
|
static void |
parkNanos(long nanos)
禁用当前线程的线程调度的目的,直到指定的等待时间,除非许可证是可用的。
|
static void |
parkNanos(Object blocker, long nanos)
禁用当前线程的线程调度的目的,直到指定的等待时间,除非许可证是可用的。
|
static void |
parkUntil(long deadline)
禁用当前线程的线程调度的目的,直到指定的最后期限,除非许可证是可用的。
|
static void |
parkUntil(Object blocker, long deadline)
禁用当前线程的线程调度的目的,直到指定的最后期限,除非许可证是可用的。
|
static void |
unpark(Thread thread)
使可用的许可证为给定的线程,如果它不是已经可用。
|
public static void unpark(Thread thread)
park
就会解锁。否则,它叫
park
下保证不阻塞。此操作不保证有任何效果,如果给定的线程没有被启动。
thread
-线程启动,或
null
,在这种情况下,此操作没有影响
public static void park(Object blocker)
如果许可证是可用的,那么它被消耗和调用立即返回;否则当前线程成为禁用线程调度的目的,并处于休眠状态,直到三个事情发生:
unpark
与当前线程为目标;或这种方法不报告这些导致了返回的方法。来电者应该重新检查导致线程停在第一位的条件。调用方也可以确定返回的线程的中断状态。
blocker
-同步对象负责该线停车
public static void parkNanos(Object blocker, long nanos)
如果许可证是可用的,那么它被消耗和调用立即返回;否则当前线程成为禁用线程调度的目的,并处于休眠状态,直到四个事情发生:
unpark
与当前线程为目标;或这种方法不报告这些导致了返回的方法。来电者应该重新检查导致线程停在第一位的条件。调用方也可以确定,例如,线程的中断状态,或返回时所用的时间。
blocker
-同步对象负责该线停车
nanos
-纳秒的最大数量等
public static void parkUntil(Object blocker, long deadline)
如果许可证是可用的,那么它被消耗和调用立即返回;否则当前线程成为禁用线程调度的目的,并处于休眠状态,直到四个事情发生:
unpark
与当前线程为目标;或这种方法不报告这些导致了返回的方法。来电者应该重新检查导致线程停在第一位的条件。调用方也可以确定,例如,线程的中断状态,或当前返回的时间。
blocker
-同步对象负责该线停车
deadline
的绝对时间,以毫秒为单位的时代,等到
public static Object getBlocker(Thread t)
t
-螺纹
NullPointerException
如果参数为null
public static void park()
如果许可证是可用的,那么它被消耗和调用立即返回;否则当前线程成为禁用线程调度的目的,并处于休眠状态,直到三个事情发生:
unpark
与当前线程为目标;或这种方法不报告这些导致了返回的方法。来电者应该重新检查导致线程停在第一位的条件。调用方也可以确定返回的线程的中断状态。
public static void parkNanos(long nanos)
如果许可证是可用的,那么它被消耗和调用立即返回;否则当前线程成为禁用线程调度的目的,并处于休眠状态,直到四个事情发生:
unpark
与当前线程为目标;或这种方法不报告这些导致了返回的方法。来电者应该重新检查导致线程停在第一位的条件。调用方也可以确定,例如,线程的中断状态,或返回时所用的时间。
nanos
-纳秒的最大数量等
public static void parkUntil(long deadline)
如果许可证是可用的,那么它被消耗和调用立即返回;否则当前线程成为禁用线程调度的目的,并处于休眠状态,直到四个事情发生:
unpark
与当前线程为目标;或这种方法不报告这些导致了返回的方法。来电者应该重新检查导致线程停在第一位的条件。调用方也可以确定,例如,线程的中断状态,或当前返回的时间。
deadline
的绝对时间,以毫秒为单位的时代,等到
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.