我想知道是否有人使用java.util.concurrent.Exchanger類。根據java文檔,交換器可用於共享一對線程之間的一些數據。以下示例是讀取和寫入數據以及線程間交互的典型用例。Exchanger Vs CountDownLatch
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();
}
}
對於兩個CountDownLatch也可以做同樣的事情。一個用於寫入緩衝區,一個用於在所有讀取器線程處理完記錄後通知編寫器。所以我的問題是
- 什麼是交換 理想的使用
- 它有哪些優點和缺點在說的CountDownLatch
據我所知,你在上面得到的是'發生之前'關係的保證,即線程A對交換對象做的所有事情都將被線程B看到,反之亦然。顧名思義,它在線程之間交換對象,在一次調用中處理兩個方向。它代表了比倒計時鎖存器更專業但更高層次的操作。 – biziclop
謝謝@biziclop。我想我能從中得到的是雖然同樣的事情可以通過鎖存器或信號量來實現,但是Exhanger對於這種工作是特定的,只要在讀寫器線程之間共享數據容器不是一個大問題。 – Tatha
@Taffa這是我的至少承諾,但作爲一個聲明,我不得不說,我從來沒有在憤怒中使用過「交換器」。可能很容易出現一些我忽略的重要細節。 – biziclop