java - 使用 Futures 并行运行多个调用 go 生成对象

标签 java java-8 completable-future

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

我必须使用 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/

相关文章:

java - Android - 代码覆盖率测试错误

java - 使用预定义的scrypt文件通过Spring自动生成sql表

java - 具有 CompletableFutures 且没有自定义 Executors 的代码是否仅使用等于核心数的线程数?

java - .exceptionally()是否会捕获嵌套的Future中抛出的异常?或者在哪里放置.exceptionally()是正确的

java - 在申请 CompletableFutures 的函数中抛出异常

java - 如何让客户端等待 Java JAX-RS 服务以防止 DOS

java服务与资源共享

java - 如何按两个字段排序,其中之一是枚举?

java - 流操作应用于列表元素的顺序是什么?

java - 两个不同的自定义对象列表与流的交集和并集