- 含まれているクラス:
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;
}
}
-
メソッドのサマリー
修飾子と型メソッド説明boolean
block()
ロックまたは条件を待機しているスレッドなどの現在のスレッドを、可能な場合にブロックします。boolean
ブロックが不要な場合にtrue
を返します。
-
メソッドの詳細
-
block
boolean block() throws InterruptedExceptionロックまたは条件を待機しているスレッドなどの現在のスレッドを、可能な場合にブロックします。- 戻り値:
- 追加のブロックが必要でない場合(つまり、isReleasableがtrueを返す場合)は
true
- 例外:
InterruptedException
- 待機中に割り込まれた場合(この処理はメソッドに必要ではないが、許可されている)
-
isReleasable
boolean isReleasable()ブロックが不要な場合にtrue
を返します。- 戻り値:
- ブロックが不要な場合は
true
-