Exchanger 是 Java 並發包中用於雙線程數據交換的同步工具。它提供一個同步點,兩個線程分別調用 exchange() 方法,第一個到達的線程會阻塞,直到第二個線程到達,隨後雙方交換數據並繼續執行。
package com.ljq.test.thread;
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 exchanger = new Exchanger<>();
// 線程 A:發送 "張三"
service.execute(() -> {
try {
String data1 = "張三";
System.out.println("線程 " + Thread.currentThread().getName() + " 正在發送數據:" + data1);
Thread.sleep((long) (Math.random() * 10000));
String data2 = exchanger.exchange(data1);
System.out.println("線程 " + Thread.currentThread().getName() + " 收到數據:" + data2);
} catch (Exception e) {
e.printStackTrace();
}
});
// 線程 B:發送 "李四"
service.execute(() -> {
try {
String data1 = "李四";
System.out.println("線程 " + Thread.currentThread().getName() + " 正在發送數據:" + data1);
Thread.sleep((long) (Math.random() * 10000));
String data2 = exchanger.exchange(data1);
System.out.println("線程 " + Thread.currentThread().getName() + " 收到數據:" + data2);
} catch (Exception e) {
e.printStackTrace();
}
});
service.shutdown();
}
}
線程 pool-1-thread-1 正在發送數據:張三
線程 pool-1-thread-2 正在發送數據:李四
線程 pool-1-thread-1 收到數據:李四
線程 pool-1-thread-2 收到數據:張三
exchange() 會阻塞直到配對線程到達,若需超時控制可使用 exchange(V, timeout, TimeUnit)。