java.util.concurrent
クラス Exchanger<V>
java.lang.Object
  
java.util.concurrent.Exchanger<V>
- 型パラメータ:
 V - 交換可能なオブジェクトの型
public class Exchanger<V>
- extends Object
 
2 つのスレッドがオブジェクトを交換可能な同期ポイント。各スレッドは、エントリ上のオブジェクトを exchange メソッドに提供し、他のスレッドの提供するオブジェクトを代わりに受け取ります。
使用例: 以下に、Exchanger を使用してスレッド間でバッファを交換するクラスの主要部分を示します。バッファを満たすスレッドが必要に応じて新しい空のバッファを取得し、バッファを空にするスレッドに満たされたバッファを渡します。
 
class FillAndEmpty {
Exchanger<DataBuffer> exchanger = new Exchanger();
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.full())
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.empty())
currentBuffer = exchanger.exchange(currentBuffer);
}
} catch (InterruptedException ex) { ... handle ...}
}
}
void start() {
new Thread(new FillingLoop()).start();
new Thread(new EmptyingLoop()).start();
}
}
- 導入されたバージョン:
 
  - 1.5
 
 
| 
メソッドの概要 | 
 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 | 
 
Exchanger
public Exchanger()
- 新しい Exchanger を作成します。
 
exchange
public V exchange(V x)
           throws InterruptedException
割り込みが発生しないかぎり、別のスレッドがこの交換ポイントに到達するまで待機し、指定されたオブジェクトをそのスレッドに転送して、代わりにオブジェクトを受け取ります。
別のスレッドがすでに交換ポイントで待機している場合、再開してスレッドのスケジューリングを実行し、現在のスレッドが渡すオブジェクトを受け取ります。現在のスレッドはただちに復帰して、他のスレッドから交換用に渡されるオブジェクトを受け取ります。
交換ポイントで待機中の他のスレッドが存在しない場合、現在のスレッドはスレッドスケジューリングについて無効とされ、次の 2 つのいずれかが発生するまで待機します。
 - 別のスレッドが交換に入る
 - 別のスレッドが現在のスレッドに
割り込みを行う 
現在のスレッドが、
 - このメソッドへのエントリ上で設定された割り込みステータスを保持するか、
 - 交換の待機中に
割り込みが発生した場合、
 
 InterruptedException がスローされ、現在のスレッドの割り込みステータスがクリアされます。
- パラメータ:
 x - 交換するオブジェクト
- 戻り値:
 - 他のスレッドにより提供されるオブジェクト
 - 例外:
 InterruptedException - 待機中に、現在のスレッドで割り込みが発生した場合
 
exchange
public V exchange(V x,
                  long timeout,
                  TimeUnit unit)
           throws InterruptedException,
                  TimeoutException
割り込みが発生するか、指定された待機時間が経過しないかぎり、別のスレッドがこの交換ポイントに到達するまで待機し、指定されたオブジェクトをそのスレッドに転送して、代わりにオブジェクトを受け取ります。
別のスレッドがすでに交換ポイントで待機している場合、再開してスレッドのスケジューリングを実行し、現在のスレッドが渡すオブジェクトを受け取ります。現在のスレッドはただちに復帰して、他のスレッドから交換用に渡されるオブジェクトを受け取ります。
交換ポイントで待機中の他のスレッドが存在しない場合、現在のスレッドはスレッドスケジューリングについて無効とされ、次の 3 つのいずれかが発生するまで待機します。
 - 別のスレッドが交換に入る
 - 別のスレッドが現在のスレッドに
割り込みを行う      - 指定された待機時間が経過する
 
現在のスレッドが、
 - このメソッドへのエントリ上で設定された割り込みステータスを保持するか、
 - 交換の待機中に
割り込みが発生した場合、
 
 InterruptedException がスローされ、現在のスレッドの割り込みステータスがクリアされます。
指定された待機時間が経過すると、TimeoutException がスローされます。時間がゼロまたはそれより小さい場合、メソッドは待機しません。
- パラメータ:
 x - 交換するオブジェクトtimeout - 待機する最長時間unit - timeout 引数の時間単位
- 戻り値:
 - 他のスレッドにより提供されるオブジェクト
 - 例外:
 InterruptedException - 待機中に、現在のスレッドで割り込みが発生した場合
TimeoutException - 別のスレッドが交換に入る前に、指定された待機時間が経過した場合
 
バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。