👩💻 Что такое Exchanger в Java и зачем он нужен?
Exchanger — это синхронизатор из пакета java.util.concurrent, который позволяет двум потокам обмениваться данными в точке встречи. Каждый поток вызывает метод exchange(), и когда оба потока доходят до этой точки, они обмениваются переданными объектами.
• Позволяет безопасно обмениваться объектами между потоками
• Подходит для реализации producer-consumer моделей
• Удобен для синхронных этапов вычислений
⚡️ Пример:
import java.util.concurrent.Exchanger;
public class Main {
public static void main(String[] args) {
Exchanger exchanger = new Exchanger();
Runnable producer = () -> {
try {
String data = "Данные от Producer";
System.out.println("Producer отправил: " + data);
String response = exchanger.exchange(data);
System.out.println("Producer получил: " + response);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
Runnable consumer = () -> {
try {
String data = "Ответ от Consumer";
System.out.println("Consumer отправил: " + data);
String received = exchanger.exchange(data);
System.out.println("Consumer получил: " + received);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
new Thread(producer).start();
new Thread(consumer).start();
}
}
➡️ Easy Java | #Теория
Exchanger — это синхронизатор из пакета java.util.concurrent, который позволяет двум потокам обмениваться данными в точке встречи. Каждый поток вызывает метод exchange(), и когда оба потока доходят до этой точки, они обмениваются переданными объектами.
Это удобно, когда два потока должны координировать свои действия, передавая результаты вычислений друг другу.
• Позволяет безопасно обмениваться объектами между потоками
• Подходит для реализации producer-consumer моделей
• Удобен для синхронных этапов вычислений
⚡️ Пример:
import java.util.concurrent.Exchanger;
public class Main {
public static void main(String[] args) {
Exchanger exchanger = new Exchanger();
Runnable producer = () -> {
try {
String data = "Данные от Producer";
System.out.println("Producer отправил: " + data);
String response = exchanger.exchange(data);
System.out.println("Producer получил: " + response);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
Runnable consumer = () -> {
try {
String data = "Ответ от Consumer";
System.out.println("Consumer отправил: " + data);
String received = exchanger.exchange(data);
System.out.println("Consumer получил: " + received);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
new Thread(producer).start();
new Thread(consumer).start();
}
}
👀 Exchanger особенно полезен, когда два потока выполняют разные задачи и должны регулярно обмениваться результатами — например, генератор данных и обработчик, или два этапа сложного расчёта.
➡️ Easy Java | #Теория