Exchanger 是 JDK 併發包中獨特的同步點,支援兩個線程在同步點交換數據對象。本文通過「讀線程填充緩衝區、寫線程消費緩衝區」的雙緩衝模式演示其核心價值。
public class BufferExchanger {
private static final Exchanger<List<String>> exchanger = new Exchanger<>();
private static final int BUFFER_SIZE = 10;
public static void main(String[] args) {
new Thread(() -> { // 讀線程:生產數據
List<String> buffer = new ArrayList<>();
while (true) {
buffer.clear();
for (int i = 0; i < BUFFER_SIZE; i++) buffer.add("data-" + System.nanoTime());
try { buffer = exchanger.exchange(buffer); } // 交換滿緩衝區,拿回空緩衝區
catch (InterruptedException e) { break; }
}
}, "Reader").start();
new Thread(() -> { // 寫線程:消費數據
List<String> buffer = new ArrayList<>();
while (true) {
try { buffer = exchanger.exchange(buffer); } // 交換空緩衝區,拿回滿緩衝區
catch (InterruptedException e) { break; }
buffer.forEach(System.out::println); // 處理數據
buffer.clear(); // 準備下輪
}
}, "Writer").start();
}
}
Exchanger<V> 編譯期保證類型一致。| 適用 | 不適用 |
|---|---|
| 雙線程管道流(讀/寫、壓縮/解壓、加密/解密) | 多生產者/多消費者(用 BlockingQueue) |
| 雙緩衝區渲染(遊戲/圖形) | 單向數據流(用 BlockingQueue/Disruptor) |
| 檢查點同步(雙線程協作算法) | 需廣播/多播的場景 |
ArrayList.clear() 復用),否則無意義。Future.get(timeout) 包裝)。Exchanger 是「雙線程零拷貝交換」的專用工具,用對場景極其優雅,濫用則增加複雜度。記住:只有兩個線程、雙向交換、可復用緩衝區 時才考慮它。