运行 多个并行调用使用 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 对象上执行。