モジュール java.base
パッケージ 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 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