public static interface ForkJoinPool.ManagedBlocker
ForkJoinPool
中运行的任务。
A ManagedBlocker
提供了两种方法。 如果true
阻塞,方法isReleasable
必须返回true。 如果需要,方法block
阻止当前线程(可能在实际阻塞之前内部调用isReleasable
)。 这些操作通过调用ForkJoinPool.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; } }
Modifier and Type | Method and Description |
---|---|
boolean |
block()
可能阻止当前线程,例如等待锁或条件。
|
boolean |
isReleasable()
如果
true 阻塞,则返回true。
|
boolean block() throws InterruptedException
true
如果不需要额外的阻塞(即,如果isReleasable将返回true)
InterruptedException
- 如果在等待时中断(该方法不需要这样做,但允许)
boolean isReleasable()
true
阻塞,则返回true。
true
如果阻塞是不必要的