V
- 交換されるオブジェクトの型public class Exchanger<V> extends Object
exchange
メソッドに入ると何らかのオブジェクトを提供し、パートナースレッドと照合して、復帰時にそのパートナーのオブジェクトを受け取ります。Exchanger は、SynchronousQueue
の双方向形式として表示されることがあります。Exchanger は、遺伝アルゴリズムやパイプライン設計などのアプリケーションで便利です。
使用例: ここでは、Exchanger
を使用してスレッド間でバッファーを交換するクラスのサマリーを示します。バッファーを満たすスレッドが必要に応じて新しい空のスレッドを取得し、バッファーを空にするスレッドに満たされたバッファーを渡します。
class FillAndEmpty {
Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>();
DataBuffer initialEmptyBuffer = ... a made-up type
DataBuffer initialFullBuffer = ...
class FillingLoop implements Runnable {
public void run() {
DataBuffer currentBuffer = initialEmptyBuffer;
try {
while (currentBuffer != null) {
addToBuffer(currentBuffer);
if (currentBuffer.isFull())
currentBuffer = exchanger.exchange(currentBuffer);
}
} catch (InterruptedException ex) { ... handle ... }
}
}
class EmptyingLoop implements Runnable {
public void run() {
DataBuffer currentBuffer = initialFullBuffer;
try {
while (currentBuffer != null) {
takeFromBuffer(currentBuffer);
if (currentBuffer.isEmpty())
currentBuffer = exchanger.exchange(currentBuffer);
}
} catch (InterruptedException ex) { ... handle ...}
}
}
void start() {
new Thread(new FillingLoop()).start();
new Thread(new EmptyingLoop()).start();
}
}
メモリー整合性効果: Exchanger
を介してオブジェクトを正常に交換するスレッドの各ペアでは、各スレッド内の exchange()
の前のアクションは、もう一方のスレッド内の対応する exchange()
からの復帰に続くアクションの前に発生します。
コンストラクタと説明 |
---|
Exchanger()
新しい Exchanger を作成します。
|
修飾子と型 | メソッドと説明 |
---|---|
V |
exchange(V x)
現在のスレッドは、割り込みが発生しないかぎり、もう一方のスレッドがこの交換ポイントに達するまで待機し、指定されたオブジェクトをそのスレッドに転送して、代わりにもう一方のスレッドのオブジェクトを受け取ります。
|
V |
exchange(V x, long timeout, TimeUnit unit)
現在のスレッドは、割り込みが発生するか、指定された待機時間が経過しないかぎり、もう一方のスレッドがこの交換ポイントに達するまで待機し、指定されたオブジェクトをそのスレッドに転送して、代わりにもう一方のスレッドのオブジェクトを受け取ります。
|
public V exchange(V x) throws InterruptedException
もう一方のスレッドがすでに交換ポイントで待機している場合、そのスレッドはスレッドのスケジューリングを再開して、現在のスレッドが渡すオブジェクトを受け取ります。現在のスレッドはすぐに復帰して、もう一方のスレッドが交換ポイントに渡すオブジェクトを受け取ります。
交換ポイントで待機中の他のスレッドが存在しない場合、現在のスレッドはスレッドのスケジューリングに関して無効になり、次の 2 つのいずれかが起きるまで待機します。
現在のスレッドで、
InterruptedException
がスローされ、現在のスレッドの割り込みステータスがクリアされます。x
- 交換するオブジェクトInterruptedException
- 待機中に現在のスレッドで割り込みが発生した場合public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
もう一方のスレッドがすでに交換ポイントで待機している場合、そのスレッドはスレッドのスケジューリングを再開して、現在のスレッドが渡すオブジェクトを受け取ります。現在のスレッドはすぐに復帰して、もう一方のスレッドが交換ポイントに渡すオブジェクトを受け取ります。
交換ポイントで待機中の他のスレッドが存在しない場合、現在のスレッドはスレッドのスケジューリングに関して無効になり、次の 3 つのいずれかが起きるまで待機します。
現在のスレッドで、
InterruptedException
がスローされ、現在のスレッドの割り込みステータスがクリアされます。
指定された待機時間が経過すると、TimeoutException
がスローされます。時間がゼロまたはそれより小さい場合、メソッドは待機しません。
x
- 交換するオブジェクトtimeout
- 待機する最長時間unit
- timeout 引数の時間単位InterruptedException
- 待機中に現在のスレッドで割り込みが発生した場合TimeoutException
- 別のスレッドが交換に入る前に、指定された待機時間が経過した場合 バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.