Установка двух или более переменных объекта Java с использованием многопоточности - PullRequest
1 голос
/ 16 апреля 2019

У меня есть этот объект следующим образом:

@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

Если у кого-то есть идеи о том, как выполнить то, что я делаю, и какие-либо советы или указатели, пожалуйста, дайте мне знать,

Спасибо

...