Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多线程设置Java对象的两个或多个变量_Java_Multithreading_Java 8_Executorservice - Fatal编程技术网

使用多线程设置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-你能分享一些你建议的源代码吗?另外,这样做的好处是什么?为什么你认为“哪个线程先完成”很重要?