如何使用现代Java 8功能异步发出2个HTTP请求



我来自JS世界,试图了解异步编程在现代Java中是如何工作的。我读到这个主题最近的重大更新是在Java 8中进行的,他们在其中引入了CompletableFuture类,但它似乎有点复杂,我认为如果我与我已经知道的东西有一些相似之处,它会更容易理解。

在现代Node.js中,为了用异步调用(IO、网络等(异步执行两个函数,我会编写Promise.all(function1(), function2())

假设我想异步地发出3个HTTPGet请求,获取执行结果,并将其用于某个名为consumeResults()的函数。以下是我在Node.js 中的操作方法

async function executeAndDoSomethingWithResults() {
const request1 = httpGetRequest("url1")
const request2 = httpGetRequest("url2")
const request3 = httpGetRequest("url3")
const results = await Promise.all([request1, request2, request3])
consumeResults(results)
}
async function httpGetRequest(url) {
// blablabla
// wrap the native http module to return a Promise
}

Java 8+中这段代码的替代方案是什么?

在Java中,您可以模仿相同的行为并设计

void executeAndDoSomethingWithResults() {
CompletableFuture<SomeClass> request1 = httpGetRequest("url1");
CompletableFuture<SomeClass> request2 = httpGetRequest("url2");
CompletableFuture<SomeClass> request3 = httpGetRequest("url3");
CompletableFuture.allOf(request1, request2, request3)
.thenApply(ignore -> 
consumeResults(request1.join(), request2.join(), request3.join())
);
}
CompletableFuture<SomeClass> httpGetRequest(final String url) {
// blablabla
}

代码可以进行更多优化。

最新更新