Мне было интересно, если кто-то использовал класс java.util.concurrent.Exchanger. Согласно java docs Exchange может использоваться для обмена некоторыми данными между парой для потоков. Нижеприведенный пример является типичным для чтения и записи данных и взаимодействия между потоками.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 s. Один для записи в буфер и один для уведомления автора, как только все потоки читателей обработали записи. Так что мой вопрос
- Что такое идеальное использование Exchanger
- Каковы плюсы и минусы над сказать CountDownLatch
Насколько я могу судить, то, что вы получаете сверху, является гарантией отношения «происходить до», то есть все нитки А, сделанные с обмениваемым объектом, будут видны потоком B и наоборот. И, как следует из названия, он обменивает объекты между потоками, обрабатывая оба направления в одном вызове. Он представляет собой более специализированную, но более высокоуровневую операцию, чем защелка обратного отсчета. – biziclop
Спасибо @biziclop. Я предполагаю, что я могу извлечь из этого, хотя то же самое можно было бы достичь через Latches или Semafhores, Exhangers являются специфическими для такого рода работ, если не проблема в совместном использовании контейнера данных между потоками чтения n читателя. – Tatha
@Taffa Это мое, по крайней мере, на это, но, как отказ от ответственности, я должен сказать, что я никогда не использовал 'Exchanger' в гневе. Там может быть несколько важных деталей, которые я забыл. – biziclop