public static interface ForkJoinPool.ManagedBlocker
ForkJoinPool
内で実行中のタスクについての管理対象の並列性を拡張するためのインタフェースです。
ManagedBlocker
は、2 つのメソッドを提供します。ブロックが必要でない場合、isReleasable
メソッドは true
を返す必要があります。block
メソッドは、必要に応じて (おそらく、実際にブロックする前に内部的に isReleasable
を呼び出して) 現在のスレッドをブロックします。これらのアクションは、ForkJoinPool.managedBlock(java.util.concurrent.ForkJoinPool.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 を返します。 |
boolean block() throws InterruptedException
true
InterruptedException
- 待機中に割り込まれた場合 (この処理はメソッドに必要ではないが、許可されている)boolean isReleasable()
true
を返します。 バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.