我必须构建自定义类型对象,并且在返回和填充对象之前有多个调用。
我必须使用 Java 8 Future 并行构建对象,这样代码块会更优先。
代码如下 -
public CustomRequest getCustomRequest(Member member,
Address address,Member member){
CustomRequest customRequest = new CustomRequest();
CompletableFuture.runAsync(() -> {
populateAddress(address, customRequest);
populatecontact(contact, customRequest);
populateMemberDetails(member, customRequest);
});
return customRequest;
}
目前正在获取“在 customRequest 对象中未设置任何值”(已在 populatecontact、populatecontact 和 populateMemberDetails 中设置一些值到 customRequest 对象)作为方法调用的返回,确实需要等待 CompletableFuture 或使用 Futures 本身错了。
最佳答案
问题是您在填充之前返回了自定义请求,因为您在对象仍在不同线程中填充时返回了该对象。如果你想要对象customRequest
要在返回之前完全填充,您需要等待 CompletableFuture
通过调用方法 CompletableFuture.get()
来完成像这样:
public CustomRequest getCustomRequest(Member member,
Address address,Member member){
CustomRequest customRequest = new CustomRequest();
CompletableFuture.runAsync(() -> {
populateAddress(address, customRequest);
populatecontact(contact, customRequest);
populateMemberDetails(member, customRequest);
}).get();//EDIT: added get method here to wait for the execution
return customRequest;
}
但是使用CompletableFuture
并没有多大意义(除了人口是在另一个线程中完成的)。它仍然是一个阻塞调用,您必须等待对象被填充。
您可以尝试使用 java 8 Future
像这样的框架:
public CompletableFuture<CustomRequest> getCustomRequest(Member member, Address address, Member member){
return CompletableFuture.supplyAsync(() -> {
CustomRequest customRequest = new CustomRequest();
populateAddress(address, customRequest);
populatecontact(contact, customRequest);
populateMemberDetails(member, customRequest);
return customRequest;
});
}
这样您就可以创建像这样的方法调用(仅作为示例):
getCustomRequest(aMember, anAddress, anotherMember).thenAccept(populatedCustomRequest -> populatedCustomRequest.doSomethingUsefull());
使用例如方法thenAccept(Consumer)类(class)CompletableFuture
。这将导致方法 doSomethingUsefull()
类(class)CustomRequest
在完整填充的 CustomRequest
上执行对象一旦被填充。
关于java - 使用 Futures 并行运行多个调用 go 生成对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57295345/