运行 多个并行调用使用 Futures 生成对象
Run multiple call in parallel go generate object using Futures
我必须构建自定义类型对象,并且在 returning 和填充对象之前有多个调用。
我必须使用 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;
}
目前正在获取 "No values set in side of customRequest object"(已将 populatecontact、populatecontact 和 populateMemberDetails 中的一些值设置为 customRequest 对象)作为方法调用的 return,需要等待 CompletableFuture 或 Futures 的使用本身就错了。
问题是您 return 自定义请求在它被填充之前,因为您的 return 对象仍在另一个线程中被填充。如果您希望对象 customRequest
在 return 之前完全填充,您需要等待 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());
使用例如class CompletableFuture
的方法 thenAccept(Consumer)。这将导致 class CustomRequest
的方法 doSomethingUsefull()
在填充后立即在完整填充的 CustomRequest
对象上执行。
我必须构建自定义类型对象,并且在 returning 和填充对象之前有多个调用。
我必须使用 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;
}
目前正在获取 "No values set in side of customRequest object"(已将 populatecontact、populatecontact 和 populateMemberDetails 中的一些值设置为 customRequest 对象)作为方法调用的 return,需要等待 CompletableFuture 或 Futures 的使用本身就错了。
问题是您 return 自定义请求在它被填充之前,因为您的 return 对象仍在另一个线程中被填充。如果您希望对象 customRequest
在 return 之前完全填充,您需要等待 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());
使用例如class CompletableFuture
的方法 thenAccept(Consumer)。这将导致 class CustomRequest
的方法 doSomethingUsefull()
在填充后立即在完整填充的 CustomRequest
对象上执行。