- 封装类:
-
ForkJoinPool
public static interface ForkJoinPool.ManagedBlocker
用于扩展在
ForkJoinPool
中运行的任务的受控并行性的接口。
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() { // 在 pool.managedBlock 完成后调用
return item;
}
}
-
Method Summary
-
Method Details
-
block
可能会阻塞当前线程,例如等待锁或条件。- 返回:
-
true
如果不需要额外的阻塞(即如果 isReleasable 将返回 true) - 抛出:
-
InterruptedException
- 如果在等待时被中断(方法不一定要这样做,但允许)
-
isReleasable
boolean isReleasable()如果不需要阻塞,则返回true
。- 返回:
-
true
如果不需要阻塞
-