5.1 sendAsync()方法

您還可以使用 HttpClient 發送異步請求。通常這是在三種情況下完成的。

第一種情況是請求會花費很長時間,比如發送/接收一個文件。然後啟動並異步執行此操作。

第二種情況是您需要非常頻繁地發送請求並且您不希望在發送下一個請求之前等待上一個請求的響應。

最後,第三種情況——你的請求結果對你來說並不重要。例如,您每分鐘截取一次屏幕截圖並將其發送到服務器。也就是說,您的應用程序的邏輯假設有很多請求,但並非所有請求都能到達。然後根據原則工作很方便 - 發送後忘記。

為了發送異步請求,您需要調用sendAsync()HttpClient 類對象的方法。此方法立即退出並返回一個CompletableFuture<HttpResponse>. 有了它,您可以跟踪請求實際執行的時間,以及在請求完成後執行某些代碼。例子:

HttpClient client = HttpClient.newBuilder().build();

CompletableFuture<HttpResponse<String>> response = client.sendAsync(
        request,
        HttpResponse.BodyHandlers.ofString()
);

該方法sendAsync()返回一個對象CompletableFuture,其中包含一個 HttpResponse,其中包含服務器將返回的字符串。

5.2 executor()方法,ExecutorService

ExecutorService此外,HttpClient 允許您將用於執行異步請求的線程傳遞給它(線程池)。實際上,在服務器端 Java 應用程序中,總是這樣做的。

畢竟,如果對於您的 API 的每個傳入請求,您將在其他地方啟動多個異步請求,您將沒有足夠的線程。例子:

ExecutorService executorService = Executors.newFixedThreadPool(2);

CompletableFuture<HttpResponse<String>> response1 = HttpClient.newBuilder()
  .executor(executorService)
  .build()
  .sendAsync(request, HttpResponse.BodyHandlers.ofString());

CompletableFuture<HttpResponse<String>> response2 = HttpClient.newBuilder()
  .executor(executorService)
  .build()
  .sendAsync(request, HttpResponse.BodyHandlers.ofString());

如果沒有設置線程池,那麼默認就是。java.util.concurrent.Executors.newCachedThreadPool()