Spec-Zone .ru
спецификации, руководства, описания, API
|
public class LockSupport extends Object
Эти партнеры класса, с каждым потоком, который использует это, разрешение (в смысле Semaphore
класс). Звонок park
сразу возвратится, если разрешение будет доступно, используя это в процессе; иначе это может блокировать. Звонок unpark
делает разрешение доступным, если это не было уже доступно. (В отличие от этого с Семафорами, хотя, разрешения не накапливаются. Есть самое большее один.)
Методы park
и unpark
обеспечьте действенные средства блокирования и разблокирования потоков, которые не встречаются с проблемами, которые вызывают осуждаемые методы Thread.suspend
и Thread.resume
быть неприменимым в таких целях: Гонки между одним вызовом потока park
и другая попытка потока к unpark
это сохранит живой, из-за разрешения. Дополнительно, park
возвратится, если поток вызывающей стороны был прерван, и версии тайм-аута поддерживаются. park
метод может также возвратиться в любое другое время по "никакой причине", так вообще должен быть вызван в пределах цикла, который перепроверяет условия по возврату. В этом смысле park
служит оптимизацией "активного ожидания", которое не тратит впустую так много времени, вращаясь, но должно быть соединено с unpark
быть эффективным.
Три формы park
каждый также поддерживает a blocker
объектный параметр. Этот объект записывается, в то время как поток блокируется, чтобы разрешить контролировать и диагностические инструменты, чтобы идентифицировать причины, что потоки блокируются. (Такие инструменты могут получить доступ к методу использования блокировщиков getBlocker(java.lang.Thread)
.) Использование этих форм, а не исходных форм без этого параметра строго поощряется. Нормальный параметр, чтобы предоставить как a blocker
в пределах блокировки реализация this
.
Эти методы разрабатываются, чтобы использоваться в качестве инструментов для того, чтобы создать высокоуровневые утилиты синхронизации, и не находятся в себе полезных для большинства приложений управления совместным выполнением. 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());
}
}
Модификатор и Тип | Метод и Описание |
---|---|
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
- если параметром является нульpublic static void park()
Если разрешение доступно тогда, оно используется, и вызов сразу возвращается; иначе текущий поток становится отключенным в целях планирования потоков и бездействует, пока одна из трех вещей не происходит:
unpark
с текущим потоком как цель; или Этот метод не сообщает, какой из них заставил метод возвращаться. Вызывающие стороны должны перепроверить условия, которые заставили поток парковать во-первых. Вызывающие стороны могут также определить, например, состояние прерывания потока по возврату.
public static void parkNanos(long nanos)
Если разрешение доступно тогда, оно используется, и вызов сразу возвращается; иначе текущий поток становится отключенным в целях планирования потоков и бездействует, пока одна из четырех вещей не происходит:
unpark
с текущим потоком как цель; или Этот метод не сообщает, какой из них заставил метод возвращаться. Вызывающие стороны должны перепроверить условия, которые заставили поток парковать во-первых. Вызывающие стороны могут также определить, например, состояние прерывания потока, или прошедшее время по возврату.
nanos
- максимальное количество наносекунд, чтобы ожидатьpublic static void parkUntil(long deadline)
Если разрешение доступно тогда, оно используется, и вызов сразу возвращается; иначе текущий поток становится отключенным в целях планирования потоков и бездействует, пока одна из четырех вещей не происходит:
unpark
с текущим потоком как цель; или Этот метод не сообщает, какой из них заставил метод возвращаться. Вызывающие стороны должны перепроверить условия, которые заставили поток парковать во-первых. Вызывающие стороны могут также определить, например, состояние прерывания потока, или текущее время по возврату.
deadline
- абсолютное время, в миллисекундах от Эпохи, чтобы ожидать до
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.