可以在對中對元素進行配對和交換的線程的同步點。每個線程將條目上的某個方法呈現給 exchange 方法,與夥伴線程進行匹配,並且在返回時接收其夥伴的對象。Exchanger 可能被視爲 SynchronousQueue 的雙向形式。Exchanger 可能在應用程序(比如遺傳算法和管道設計)中很有用。
構造方法摘要
Exchanger() 創建一個新的 Exchanger。
方法摘要
CountDownLatch | CyclicBarrier |
---|---|
V | exchange(V x) 等待另一個線程到達此交換點(除非當前線程被中斷),然後將給定的對象傳送給該線程,並接收該線程的對象。 |
V | exchange(V x, long timeout, TimeUnit unit) 等待另一個線程到達此交換點(除非當前線程被中斷,或者超出了指定的等待時間),然後將給定的對象傳送給該線程,同時接收該線程的對象。 |
代碼示例
交換操作必須是成雙成對的,如果線程是奇數操作,那麼兩個會交換成功,另一個會一直等待交換。
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExchangerTest {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final Exchanger<String> exchanger = new Exchanger<String>();
service.execute(new Runnable() {
public void run() {
try {
String data1 = "zxx";
System.out.println("線程" + Thread.currentThread().getName()
+ "正在把數據" + data1 + "換出去");
Thread.sleep((long) Math.random() * 10000);
String data2=(String) exchanger.exchange(data1);
System.out.println("線程" + Thread.currentThread().getName()
+ "換回的數據爲" + data2);
} catch (Exception e) {
e.printStackTrace();
}
}
});
service.execute(new Runnable() {
public void run() {
try {
String data1 = "lhm";
System.out.println("線程" + Thread.currentThread().getName()
+ "正在把數據" + data1 + "換出去");
Thread.sleep((long) Math.random() * 10000);
String data2=(String) exchanger.exchange(data1);
System.out.println("線程" + Thread.currentThread().getName()
+ "換回的數據爲" + data2);
} catch (Exception e) {
e.printStackTrace();
}
}
});
service.shutdown();
}
}