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();
→ Ссылка