Exchanger передает только в одном направлении java
у меня этот код выводит не expected результат. То, есть, у покупателя должна быть в итоге трава, а у продавца кэш, если я без сеттера делаю, то все ок. есть идеи, почему?
package utils;
import java.util.concurrent.Exchanger;
public class MainExchanger {
static class ExchangedItem {
private String item;
public ExchangedItem(String item) {
this.item = item;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
}
public static void main(String[] args) throws InterruptedException {
Exchanger<ExchangedItem> exchanger = new Exchanger<>();
ExchangedItem item = new ExchangedItem("Кэш");
ExchangedItem item2 = new ExchangedItem("ПРИПРАВА ДЛЯ РОЛТОНА");
new Thread(() -> {
System.out.println("Покупатель:Псс, есть че?У меня есть " + item.getItem());
try {
item.setItem(exchanger.exchange(item).getItem());
System.out.println("Покупатель:Ура, у меня есть " + item.getItem());
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
Thread.sleep(2000);
new Thread(() -> {
System.out.println("Продавец:*протягивает " + item2.getItem() + "*");
try {
item2.setItem(exchanger.exchange(item2).getItem());
System.out.println("Продавец:*берет "+item2.getItem()+"* Я тебя не видел, я тебя не знаю,спасибо за " + item2.getItem());
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
Ответы (1 шт):
Автор решения: dmtr
→ Ссылка
Потому что вы не правильно понимаете предназначение класса Exchanger. Этот класс выступает в роли буффера для обмена данными между потоками. И это не работает так, как вы хотели сделать.
Вот вам рабочий пример:
Exchanger<String> exchanger = new Exchanger<>();
new Thread(() -> {
String s = "деньги";
System.out.println("Мальчик: Дядя! Дядя! У вас есть мармелад? У меня есть " + s);
try {
s = exchanger.exchange(s);
System.out.println("Мальчик: Ура, у меня есть " + s);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
Thread.sleep(2000);
new Thread(() -> {
String s = "мармелад";
System.out.println("Продавец: *протягивает " + s + "*");
try {
s = exchanger.exchange(s);
System.out.println("Продавец: *берет "+ s +"* Я тебя не видел, я тебя не знаю, спасибо за " + s);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();