インタフェースForkJoinPool.ManagedBlocker

含まれているクラス:
ForkJoinPool

public static interface ForkJoinPool.ManagedBlocker
ForkJoinPool内で実行中のタスクについての管理対象の並列性を拡張するためのインタフェースです。

ManagedBlockerは、2つのメソッドを提供します。 ブロックが必要でない場合、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() { // call after pool.managedBlock completes
    return item;
  }
}

導入されたバージョン:
1.7
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    boolean
    ロックまたは条件を待機しているスレッドなどの現在のスレッドを、可能な場合にブロックします。
    boolean
    ブロックが不要な場合にtrueを返します。
  • メソッドの詳細

    • block

      boolean block() throws InterruptedException
      ロックまたは条件を待機しているスレッドなどの現在のスレッドを、可能な場合にブロックします。
      戻り値:
      追加のブロックが必要でない場合(つまり、isReleasableがtrueを返す場合)はtrue
      スロー:
      InterruptedException - 待機中に割り込まれた場合(この処理はメソッドに必要ではないが、許可されている)
    • isReleasable

      boolean isReleasable()
      ブロックが不要な場合にtrueを返します。
      戻り値:
      ブロックが不要な場合はtrue