JavaTM Platform
Standard Ed. 6

java.util.concurrent
クラス Exchanger<V>

java.lang.Object
  上位を拡張 java.util.concurrent.Exchanger<V>
型パラメータ:
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() からの復帰に続くアクションの 「前に発生」 します。

導入されたバージョン:
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 Platform
Standard Ed. 6

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

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