Ответ
Exchanger<V> — это синхронизатор из java.util.concurrent, который позволяет двум потокам обменяться объектами в точке рандеву. Оба потока блокируются на вызове метода exchange() до встречи, после чего одновременно получают данные друг от друга.
Основное использование:
- Схемы типа "производитель-потребитель", где потоки симметричны и обмениваются буферами.
- Пайплайны обработки данных между потоками.
Пример обмена строками:
import java.util.concurrent.Exchanger;
public class ExchangerExample {
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<>();
new Thread(() -> {
try {
String dataFromThread2 = exchanger.exchange("Данные от Потока 1");
System.out.println("Поток 1 получил: " + dataFromThread2);
} catch (InterruptedException e) { e.printStackTrace(); }
}).start();
new Thread(() -> {
try {
String dataFromThread1 = exchanger.exchange("Данные от Потока 2");
System.out.println("Поток 2 получил: " + dataFromThread1);
} catch (InterruptedException e) { e.printStackTrace(); }
}).start();
}
}
Вывод:
Поток 1 получил: Данные от Потока 2
Поток 2 получил: Данные от Потока 1
Важно: Если один поток вызовет exchange(), а второй нет, первый будет ждать бесконечно (или до прерывания).