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, 2014, Oracle and/or its affiliates. All rights reserved.