Я пытаюсь делать параллельные звонки с потоками. Для этого я использую интерфейс 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;
}
}
Я просмотрел другие сообщения, касающиеся тем с параметрами, но я не нашел никакого решения.
Как я могу найти решение, которое будет работать для моего случая?
(Я уберу код позже)