Что такое Exchanger в Java Concurrency?

«Что такое Exchanger в Java Concurrency?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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(), а второй нет, первый будет ждать бесконечно (или до прерывания).