JavaTM 2 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() 之前的操作 happen-before 從另一執行緒中相應的 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
等待另一個執行緒到達此交換點(除非當前執行緒被中斷),然後將給定的物件傳送給該執行緒,並接收該執行緒的物件。

如果另一個執行緒已經在交換點等待,則出於執行緒排程目的,繼續執行此執行緒,並接收當前執行緒傳入的物件。當前執行緒立即返回,接收其他執行緒傳遞的交換物件。

如果還沒有其他執行緒在交換點等待,則出於排程目的,禁用當前執行緒,且在發生以下兩種情況之一前,該執行緒將一直處於休眠狀態:

如果當前執行緒:

則拋出 InterruptedException,並且清除當前執行緒的已中斷狀態。

參數:
x - 要交換的物件
返回:
另一個執行緒提供的物件
拋出:
InterruptedException - 如果當前執行緒在等待時被中斷

exchange

public V exchange(V x,
                  long timeout,
                  TimeUnit unit)
           throws InterruptedException,
                  TimeoutException
等待另一個執行緒到達此交換點(除非當前執行緒被中斷,或者超出了指定的等待時間),然後將給定的物件傳送給該執行緒,同時接收該執行緒的物件。

如果另一個執行緒已經在交換點上等待,則出於執行緒排程目的,繼續執行此執行緒,並接收當前執行緒傳入的物件。當前執行緒立即返回,並接收其他執行緒傳遞的交換物件。

如果還沒有其他執行緒在交換點等待,則出於排程目的,禁用當前執行緒,且在發生以下三種情況之一前,該執行緒將一直處於休眠狀態:

如果當前執行緒:

則拋出 InterruptedException,並且清除當前執行緒的已中斷狀態。

如果超出指定的等待時間,則拋出 TimeoutException 異常。如果該時間小於等於零,則此方法根本不會等待。

參數:
x - 要交換的物件
timeout - 要等待的最長時間
unit - timeout 參數的時間單位
返回:
其他執行緒提供的物件
拋出:
InterruptedException - 如果當前執行緒在等待時被中斷
TimeoutException - 如果在另一個執行緒進入交換點之前已經到達指定的等待時間

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only