Java - вызываемый конструктор перезаписывает переменную - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь делать параллельные звонки с потоками. Для этого я использую интерфейс Callable, потому что мне нужен параметр. Проблема в том, что я создаю потоки с параметром в цикле, и переданное значение всегда перезаписывается, поэтому, когда оно достигает метода call () , оно всегда имеет последнее переданное значение.

private HotelResponseDto getHotelsCall(HotelRequest request) {
    Set<Suggestion> suggestions = repository.findByHistoryId(request.getId());
    List<Callable<HotelWrapperDto>> calls = new ArrayList<>();
    ExecutorService executor = new ScheduledThreadPoolExecutor(suggestions.size());

    for (Suggestion s : suggestions) {
        request.setCityCode(s.getName());
        calls.add(new MyCallable(request)); //beginning of the issue
    }

    List<Future<HotelWrapperDto>> results = null;

    try {
        results = executor.invokeAll(calls);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    List<HotelWrapperDto> wrappers = new ArrayList<>();

    for (Future<HotelWrapperDto> f : Objects.requireNonNull(results)) {
        try {
            wrappers.add(f.get());
        } catch (InterruptedException | ExecutionException e) {
            log.error("Something didn't work.");
        }
    }

    HotelResponseDto response = new HotelResponseDto();
    response.setWrappers(wrappers);
    return response;
}

А вот и класс MyCallable

class MyCallable implements Callable<HotelWrapperDto> {

    private HotelRequest hotel;

    MyCallable(HotelRequest request) {
        hotel = request;
       //Here is the problem
       //Because I call this constructor in a loop,
       //hotel variable is always overwritten and in the end
       //I get the last result for every iteration 
    }

    @Override
    public HotelWrapperDto call() {
        HotelRequest hotelRequest = helper.createHotelRequest(hotel);
        HotelWrapperDto wrapper = hotelService.getHotels(hotelRequest);

        return wrapper;
    }
}

Я просмотрел другие сообщения, касающиеся тем с параметрами, но я не нашел никакого решения. Как я могу найти решение, которое будет работать для моего случая? (Я уберу код позже)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...