-
- Enclosing class:
- ForkJoinPool
public static interface ForkJoinPool.ManagedBlocker
用于扩展ForkJoinPool
中运行的任务的托管并行性的接口。ManagedBlocker
提供了两种方法。 如果不需要阻止,方法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; } }
-
-
方法摘要
所有方法 实例方法 抽象方法 变量和类型 方法 描述 boolean
block()
可能会阻塞当前线程,例如等待锁定或条件。boolean
isReleasable()
如果不需要阻止,则返回true
。
-
-
-
方法详细信息
-
block
boolean block() throws InterruptedException
可能会阻塞当前线程,例如等待锁定或条件。- 结果
-
true
如果不需要额外的阻塞(即,如果isReleasable将返回true) - 异常
-
InterruptedException
- 如果在等待时被中断(该方法不需要这样做,但允许)
-
isReleasable
boolean isReleasable()
如果不需要阻止,则返回true
。- 结果
-
true
如果不需要阻止
-
-