为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

眼眸繁星 2023-05-10 15:02:20
我必须构建自定义类型对象,并且在返回和填充对象之前有多个调用。我必须使用 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 本身的使用错误。
查看完整描述

1 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

问题是您在自定义请求被填充之前返回了自定义请求,因为您返回的对象仍在另一个线程中填充。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实际上没有多大意义(除了填充是在另一个线程中完成的)。它仍然是一个阻塞调用,您将不得不等待对象被填充。


Future您可以尝试像这样使用 java 8框架:


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)CompletableFuture。doSomethingUsefull()这将导致类的方法在填充后立即CustomRequest在完整的填充对象上执行。CustomRequest


查看完整回答
反对 回复 2023-05-10
  • 1 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信