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()