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