使用 Futures 并行运行多个调用去生成对象

我必须构建自定义类型对象,并且在返回和填充对象之前有多个调用。


我必须使用 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 本身的使用错误。


眼眸繁星
浏览 112回答 1
1回答

拉莫斯之舞

问题是您在自定义请求被填充之前返回了自定义请求,因为您返回的对象仍在另一个线程中填充。customRequest如果您希望在返回对象之前完全填充该对象,则需要通过调用如下CompletableFuture方法来等待完成:CompletableFuture.get()public CustomRequest getCustomRequest(Member member,&nbsp;&nbsp; &nbsp; Address address,Member member){&nbsp; &nbsp; CustomRequest customRequest = new CustomRequest();&nbsp; &nbsp; CompletableFuture.runAsync(() -> {&nbsp; &nbsp; &nbsp; &nbsp; populateAddress(address, customRequest);&nbsp; &nbsp; &nbsp; &nbsp; populatecontact(contact, customRequest);&nbsp; &nbsp; &nbsp; &nbsp; populateMemberDetails(member, customRequest);&nbsp; &nbsp; }).get();//EDIT: added get method here to wait for the execution&nbsp; &nbsp; return customRequest;}但是这种使用CompletableFuture实际上没有多大意义(除了填充是在另一个线程中完成的)。它仍然是一个阻塞调用,您将不得不等待对象被填充。Future您可以尝试像这样使用 java 8框架:public CompletableFuture<CustomRequest> getCustomRequest(Member member, Address address, Member member){&nbsp; &nbsp; return CompletableFuture.supplyAsync(() -> {&nbsp; &nbsp; &nbsp; &nbsp; CustomRequest customRequest = new CustomRequest();&nbsp; &nbsp; &nbsp; &nbsp; populateAddress(address, customRequest);&nbsp; &nbsp; &nbsp; &nbsp; populatecontact(contact, customRequest);&nbsp; &nbsp; &nbsp; &nbsp; populateMemberDetails(member, customRequest);&nbsp; &nbsp; &nbsp; &nbsp; return customRequest;&nbsp; &nbsp; });}这样你就可以像这样创建方法调用(只是一个例子):getCustomRequest(aMember, anAddress, anotherMember).thenAccept(populatedCustomRequest -> populatedCustomRequest.doSomethingUsefull());使用例如类的方法thenAccept(Consumer)CompletableFuture。doSomethingUsefull()这将导致类的方法在填充后立即CustomRequest在完整的填充对象上执行。CustomRequest
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java