从 CompletableFuture.allof() 中获取单个结果
Get individual results from CompletableFuture.allof()
我有一个 class,它使用 CompletableFutures 向两个相关服务发出并发请求。
我的代码如下所示:
@Builder
@Slf4j
public class TestClass {
@NonNull private final ExecutorService threadPool = Executors.newFixedThreadPool(2);
@NonNull private final dependency1Client;
@NonNull private final dependency2Client;
public void myMethod() {
RequestObject1 firstDependencyRequest = RequestObject1.builder()
.attribute1("someValue")
.attribute2("secondValue");
CompletableFuture<ResultStructure1> future1 = CompletableFuture.supplyAsync(() -> dependency1Client.call(firstDependencyRequest), threadPool);
RequestObject2 secondDependencyRequest = RequestObject2.builder()
.attribute1("someValue")
.attribute2("secondValue");
CompletableFuture<ResultStructure2> future2 = CompletableFuture.supplyAsync(() -> dependency2Client.call(secondDependencyRequest), threadPool);
try {
CompletableFuture finalFuture = CompletableFuture.allOf(future1, future2);
} catch (ExecutionException|InterruptedException e) {
log.error("Exception calling dependency", e);
throw new RuntimeException(e);
}
}
}
我需要两次调用相关服务的结果。如何在不执行阻塞调用的情况下获取它们?我最初想我会做 future1 .get(),但这是一个阻塞调用,我必须等到我得到第一个 API 调用的结果。
有没有办法从这两个调用中获取结果?
如the JavaDoc of CompletableFuture.allOf()
所示:
Otherwise, the results, if any, of the given CompletableFutures are not reflected in the returned CompletableFuture, but may be obtained by inspecting them individually.
这意味着您必须对它们调用 join()
或 get()
。如果您在 allOf()
之后在链中这样做,它不会阻塞,因为它已经保证所有这些都已经完成。
请注意,在您的特定情况下,如果您只有 2 个期货,使用 thenCombine()
可能会更简单,这样您可以更轻松地访问 2 个结果。
我有一个 class,它使用 CompletableFutures 向两个相关服务发出并发请求。
我的代码如下所示:
@Builder
@Slf4j
public class TestClass {
@NonNull private final ExecutorService threadPool = Executors.newFixedThreadPool(2);
@NonNull private final dependency1Client;
@NonNull private final dependency2Client;
public void myMethod() {
RequestObject1 firstDependencyRequest = RequestObject1.builder()
.attribute1("someValue")
.attribute2("secondValue");
CompletableFuture<ResultStructure1> future1 = CompletableFuture.supplyAsync(() -> dependency1Client.call(firstDependencyRequest), threadPool);
RequestObject2 secondDependencyRequest = RequestObject2.builder()
.attribute1("someValue")
.attribute2("secondValue");
CompletableFuture<ResultStructure2> future2 = CompletableFuture.supplyAsync(() -> dependency2Client.call(secondDependencyRequest), threadPool);
try {
CompletableFuture finalFuture = CompletableFuture.allOf(future1, future2);
} catch (ExecutionException|InterruptedException e) {
log.error("Exception calling dependency", e);
throw new RuntimeException(e);
}
}
}
我需要两次调用相关服务的结果。如何在不执行阻塞调用的情况下获取它们?我最初想我会做 future1 .get(),但这是一个阻塞调用,我必须等到我得到第一个 API 调用的结果。
有没有办法从这两个调用中获取结果?
如the JavaDoc of CompletableFuture.allOf()
所示:
Otherwise, the results, if any, of the given CompletableFutures are not reflected in the returned CompletableFuture, but may be obtained by inspecting them individually.
这意味着您必须对它们调用 join()
或 get()
。如果您在 allOf()
之后在链中这样做,它不会阻塞,因为它已经保证所有这些都已经完成。
请注意,在您的特定情况下,如果您只有 2 个期货,使用 thenCombine()
可能会更简单,这样您可以更轻松地访问 2 个结果。