JavaTM 2 Platform
Standard Ed. 5.0

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

コンストラクタの概要
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
 

コンストラクタの詳細

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 - 別のスレッドが交換に入る前に、指定された待機時間が経過した場合

JavaTM 2 Platform
Standard Ed. 5.0

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。