我一直在讀一些關于 CompletableFuture 的書。
到目前為止,我明白 CompletableFuture 與 Future 的不同之處在于它提供了將 Future 鏈接在一起的方法,使用回呼來處理 Future 的結果而不實際阻塞代碼。
但是,有一個 complete() 方法讓我很難理解。我只知道它可以讓我們手動完成一個future,但是它有什么用呢?我發現這個方法最常見的例子是在執行一些異步任務時,我們可以立即回傳一個字串。但是如果回傳值不能反映實際結果,那么這樣做有什么意義呢?如果我們想做一些異步的事情,為什么不使用常規的未來呢?我能想到的唯一用途是當我們想要有條件地取消正在進行的未來時。但我想我在這里遺漏了一些重要的關鍵點。
uj5u.com熱心網友回復:
complete() 等價于轉換前一階段結果并回傳 getResponse("a1=Chittagong&a2=city") 回應的函式,當 getResponse() 方法回應可用時,您可以在不同的執行緒中運行此方法然后 thenApply() 將被呼叫列印日志。如果您在不同的執行緒中運行 getResponse(String url) ,則不會阻止任何人。
這個例子展示了我們在從 complete() 獲取回應的同時列印日志的場景;
代碼
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class CompletableFutureEx {
Logger logger = Logger.getLogger(CompletableFutureEx.class.getName());
public static void main(String[] args) {
new CompletableFutureEx().completableFutureEx();
}
private void completableFutureEx() {
var completableFuture = new CompletableFuture<String>();
completableFuture.thenApply(response -> {
logger.log(Level.INFO, "Response : " response);
return response;
});
//some long process response
try {
completableFuture.complete(getResponse("a1=Chittagong&a2=city"));
} catch (Exception e) {
completableFuture.completeExceptionally(e);
}
try {
System.out.println(completableFuture.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
private String getResponse(String url) throws URISyntaxException, IOException, InterruptedException {
var finalUrl = "http://localhost:8081/api/v1/product/add?" url;
//http://localhost:8081/api/v1/product/add?a1=Chittagong&a2=city
var request = HttpRequest.newBuilder()
.uri(new URI(finalUrl)).GET().build();
var response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("response body " response.body());
return response.body();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/365408.html
上一篇:如何等待多個請求
