我来自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
}
代码可以进行更多优化。