Module java.base

Interface ForkJoinPool.ManagedBlocker

封装类:
ForkJoinPool

public static interface ForkJoinPool.ManagedBlocker
用于扩展在 ForkJoinPool 中运行的任务的受控并行性的接口。

ManagedBlocker 提供两个方法。方法 isReleasable() 必须在不需要阻塞时返回 true。方法 block() 如果需要,则阻塞当前线程(可能在实际阻塞之前内部调用 isReleasable)。这些操作由调用 ForkJoinPool.managedBlock(ManagedBlocker) 的任何线程执行。此API中的不寻常方法适应可能但通常不会长时间阻塞的同步器。同样,它们允许更有效地处理需要额外工作线程以确保足够并行性的情况。为此,isReleasable 方法的实现必须适合重复调用。在先前调用 isReleasableblock 返回 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

    Modifier and Type
    Method
    Description
    boolean
    block()
    可能会阻塞当前线程,例如等待锁或条件。
    boolean
    如果不需要阻塞,则返回 true
  • Method Details

    • block

      boolean block() throws InterruptedException
      可能会阻塞当前线程,例如等待锁或条件。
      返回:
      true 如果不需要额外的阻塞(即如果 isReleasable 将返回 true)
      抛出:
      InterruptedException - 如果在等待时被中断(方法不一定要这样做,但允许)
    • isReleasable

      boolean isReleasable()
      如果不需要阻塞,则返回 true
      返回:
      true 如果不需要阻塞