|
JavaTM Platform Standard Ed. 6 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
java.lang.Objectjava.util.concurrent.Exchanger<V>
V - 交換されるオブジェクトの型public class Exchanger<V>
スレッドをペアにして、ペア内の要素を交換できる同期ポイント。各スレッドは、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)
現在のスレッドは、割り込みが発生するか、指定された待機時間が経過しないかぎり、もう一方のスレッドがこの交換ポイントに達するまで待機し、指定されたオブジェクトをそのスレッドに転送して、代わりにもう一方のスレッドのオブジェクトを受け取ります。 |
| クラス java.lang.Object から継承されたメソッド |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| コンストラクタの詳細 |
|---|
public Exchanger()
| メソッドの詳細 |
|---|
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 - もう一方のスレッドが交換ポイントに入る前に、指定された経過時間が経過した場合
|
JavaTM Platform Standard Ed. 6 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。