У меня есть этот объект следующим образом:
@Builder
@Data
public class Person
private String firstName;
private int age;
Я пытаюсь получить объект Person
или объект Person.Builder
, в котором он установил эти два значения (firstName
и age
) в двух отдельных потоках. Причина в том, что мне нужно сделать сетевые вызовы, чтобы получить эти два значения, и они не зависят друг от друга.
Прямо сейчас я могу думать о чем-то вроде этого:
Callable<String> nameCallable = () -> nameService.getName(personId));
Callable<Integer> ageCallable = () -> ageService.getAge(personId);
ExecutorService executor = Executors.newFixedThreadPool(4);
Future<String> nameFuture = executor.submit(nameCallable);
Future<Integer> ageFuture = executor.submit(ageCallable);
return Person.builder().name(nameFuture.get()).age(ageFuture.get()).id(personId).build();
Я пытаюсь найти другое решение, потому что при таком подходе я не знаю, какой поток закончил первым ExecutorCompletionService
, но я не могу использовать это, потому что мои Futures имеют указанный тип возврата (String и Name). Кроме того, если у меня все вызовы имеют одинаковый тип возврата, я могу определить вызываемый элемент как @Bean
и автоматически связать все вызываемые элементы в List<Callable<T>>
, а в моем executor
я могу сделать invokeAll
Если у кого-то есть идеи о том, как выполнить то, что я делаю, и какие-либо советы или указатели, пожалуйста, дайте мне знать,
Спасибо