public static interface ForkJoinPool.ManagedBlocker
java.util.concurrent.ForkJoinPool.ManagedBlocker |
用于扩展在 ForkJoinPool
运行的任务的管理并行性的接口。
A ManagedBlocker
提供了两种方法。 如果不需要阻塞,方法isReleasable()
必须返回true
。 方法block()
根据需要阻止当前线程(可能在实际阻止之前内部调用isReleasable
)。 这些操作由调用managedBlock(ManagedBlocker)
的任何线程执行。 这个API中不寻常的方法适用于可能但通常不会长时间阻塞的同步器。 同样,它们可以更有效地处理那些可能需要额外工作人员的情况,但通常不需要确保足够的并行性。 为此,方法isReleasable
实现必须适合重复调用。
例如,下面是基于ReentrantLock的ManagedBlocker:
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;
}
}
Public methods |
|
---|---|
abstract boolean |
block() 可能阻塞当前线程,例如等待锁定或条件。 |
abstract boolean |
isReleasable() 如果不需要阻塞,则返回 |
boolean block ()
可能阻塞当前线程,例如等待锁定或条件。
Returns | |
---|---|
boolean |
true if no additional blocking is necessary (i.e., if isReleasable would return true) |
Throws | |
---|---|
InterruptedException |
if interrupted while waiting (the method is not required to do so, but is allowed to) |
boolean isReleasable ()
如果不需要阻塞,则返回 true
。
Returns | |
---|---|
boolean |
true if blocking is unnecessary |