使用多线程设置Java对象的两个或多个变量
我的目标如下:使用多线程设置Java对象的两个或多个变量,java,multithreading,java-8,executorservice,Java,Multithreading,Java 8,Executorservice,我的目标如下: @Builder @Data public class Person private String firstName; private int age; 我试图做的是获取一个Person对象或一个Person.Builder对象,它在两个单独的线程中设置了这两个值(firstName和age)。这是因为我必须通过网络调用来获取这两个值,而这两个值并不相互依赖 现在我能想到这样的事情: Callable<String> nameCallable = ()
@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();
callablenamecallable=()->nameService.getName(personId));
Callable ageCallable=()->ageService.getAge(personId);
ExecutorService executor=Executors.newFixedThreadPool(4);
Future name Future=executor.submit(nameCallable);
Future ageFuture=执行人提交(ageCallable);
返回Person.builder().name(namefurture.get()).age(ageFuture.get()).id(personId.build();
我试图找到一个不同的解决方案,因为使用这种方法,我不知道哪个线程首先完成ExecutorCompletionService
,但我不能使用它,因为我的未来有一个指定的返回类型(字符串和名称)。此外,如果所有可调用项都具有相同的返回类型,我可以将可调用项定义为@Bean
,并将所有可调用项自动关联到列表中,在我的执行器中,我可以执行invokeAll
如果有人对如何完成我正在做的事情有任何想法和建议,请告诉我
谢谢为什么不做两个可完成的未来
s,等待这两个都发生,然后用你从他们那里得到的结果创建一个人?@Eugene-你能分享一些你建议的源代码吗?另外,这样做的好处是什么?为什么你认为“哪个线程先完成了”很重要?为什么不做两个CompletableFuture
s,等待这两个都发生,然后用你从他们那里得到的结果创建一个Person
?@Eugene-你能分享一些你建议的源代码吗?另外,这样做的好处是什么?为什么你认为“哪个线程先完成”很重要?