使用多线程设置Java对象的两个或多个变量

时间:2019-04-16 01:12:42

标签: java multithreading java-8 executorservice

我具有以下对象:

@Builder
@Data
public class Person
   private String firstName;
   private int age;

我想做的是获取一个Person对象或一个Person.Builder对象,在其中它分别将这两个值(firstNameage)设置为两个线程。之所以这样,是因为我必须进行网络调用才能获得这两个值,并且它们彼此不依赖。

现在我可以想到这样的东西:

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具有指定的返回类型(字符串和名称),所以无法使用它。另外,如果我的所有可调用对象都具有相同的返回类型,则可以将可调用对象定义为@Bean并将所有可调用对象自动连接到List<Callable<T>>中,而在我的executor中,我可以{ 1}}

如果有人对如何完成我的工作有任何想法,以及任何提示或指示,请告诉我,

谢谢

0 个答案:

没有答案