Интерфейс ForkJoinPool.ManagedBlocker
- Вмещающий класс:
ForkJoinPool
public static interface ForkJoinPool.ManagedBlocker
ForkJoinPool. ManagedBlocker предоставляет два метода. Метод isReleasable() должен возвращать true, если блокировка не требуется. Метод block() при необходимости блокирует текущий поток (возможно, вызывая внутри isReleasable перед фактической блокировкой). Эти действия выполняются любым потоком, вызывающим ForkJoinPool.managedBlock(ManagedBlocker). Необычные методы этого API позволяют работать с синхронизаторами, которые иногда могут блокироваться на длительное время, но обычно этого не делают. Аналогичным образом они обеспечивают более эффективную внутреннюю обработку случаев, когда для поддержания достаточного уровня параллелизма могут потребоваться дополнительные рабочие потоки, хотя обычно они не нужны. Для этого реализации метода isReleasable должны допускать многократный вызов. Ни один из методов не вызывается после того, как предыдущий вызов isReleasable или block возвращает true.
Например, вот ManagedBlocker на основе ReentrantLock:
class ManagedLocker implements ManagedBlocker {
final ReentrantLock lock;
boolean hasLock = false;
ManagedLocker(ReentrantLock lock) { this.lock = lock; }
public boolean block() {
if (!hasLock)
lock.lock();
return true;
}
public boolean isReleasable() {
return hasLock || (hasLock = lock.tryLock());
}
} Вот класс, который может блокироваться в ожидании элемента в заданной очереди:
class QueueTaker<E> implements ManagedBlocker {
final BlockingQueue<E> queue;
volatile E item = null;
QueueTaker(BlockingQueue<E> q) { this.queue = q; }
public boolean block() throws InterruptedException {
if (item == null)
item = queue.take();
return true;
}
public boolean isReleasable() {
return item != null || (item = queue.poll()) != null;
}
public E getItem() { // call after pool.managedBlock completes
return item;
}
}
- Начиная с версии:
- 1.7
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean |
block() |
При необходимости блокирует текущий поток, например в ожидании блокировки или условия. |
boolean |
isReleasable() |
Возвращает true, если блокировка не требуется. |
Подробное описание методов
block
boolean block() throws InterruptedException
- Возвращает:
-
true, если дополнительная блокировка не требуется (то есть если isReleasable вернул бы true) - Выбрасывает:
-
InterruptedException— если ожидание было прервано (метод не обязан это делать, но ему это разрешено)
isReleasable
boolean isReleasable()
true, если блокировка не требуется.- Возвращает:
-
true, если блокировка не требуется
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/ForkJoinPool.ManagedBlocker.html