- 封闭类:
ForkJoinPool
public static interface ForkJoinPool.ManagedBlocker
用于扩展在
ForkJoinPool s 中运行的任务的托管并行性的接口。
ManagedBlocker 提供了两种方法。如果不需要阻塞,方法 isReleasable() 必须返回 true。如有必要,方法 block() 会阻塞当前线程(可能在实际阻塞之前在内部调用 isReleasable)。这些操作由调用 ForkJoinPool.managedBlock(ManagedBlocker) 的任何线程执行。此 API 中的不寻常方法适用于可能但通常不会长时间阻塞的同步器。同样,它们允许更有效地内部处理可能需要但通常不需要额外工作人员以确保足够并行性的情况。为此,isReleasable 方法的实现必须能够重复调用。在先前调用 isReleasable 或 block 返回 true 之后,这两种方法都不会被调用。
例如,这是一个基于 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;
}
}
-
方法总结
-
方法详情
-
block
可能阻塞当前线程,例如等待锁或条件。- 返回:
true如果不需要额外的阻塞(即,如果 isReleasable 将返回 true)- 抛出:
InterruptedException- 如果在等待时中断(该方法不需要这样做,但允许这样做)
-
isReleasable
boolean isReleasable()如果不需要阻塞,则返回true。- 返回:
true如果不需要阻塞
-