首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java 11 HttpClient - HttpClients与并发HttpRequests的最佳比率是多少?

Java 11 HttpClient - HttpClients与并发HttpRequests的最佳比率是多少?
EN

Stack Overflow用户
提问于 2020-10-11 10:22:10
回答 2查看 3.2K关注 0票数 4

在下面的示例中,我创建了一个Java11 httpClient,然后创建了多个并发HttpRequests。

  1. 这做法不好吗?
  2. 每个HttpRequest都应该有自己的HttpClient吗?
  3. HttpRequests的数量是否有HttpClient的上限?

代码语言:javascript
运行
复制
    private static void httpClientExample(){
    
    HttpClient httpClient = HttpClient.newHttpClient();

    System.out.println("TP1");

    var task1 = httpClient.sendAsync(HttpRequest.newBuilder()
            .uri(URI.create("https://www.bing.com/"))
            .build(), HttpResponse.BodyHandlers.ofString())
            .thenApply(HttpResponse::uri).thenAccept(System.out::println);

    var task2 = httpClient.sendAsync(HttpRequest.newBuilder()
            .uri(URI.create("https://openjdk.java.net/"))
            .build(), HttpResponse.BodyHandlers.ofString())
            .thenApply(HttpResponse::uri).thenAccept(System.out::println);
    
    var task3 = httpClient.sendAsync(HttpRequest.newBuilder()
            .uri(URI.create("https://www.google.co.uk/"))
            .build(), HttpResponse.BodyHandlers.ofString())
            .thenApply(HttpResponse::uri).thenAccept(System.out::println);


    System.out.println("Requests Sent");

    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.println("Main Thread Completed");
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-11 10:47:06

HttpClient中没有显式地记录这一点。但是可以预期,HttpClient是为处理多个请求而设计的。从某种意义上说,这在Java客户端简介中是隐含的。

一旦构建,HttpClient就可以用于发送多个请求。

现在,您的问题可能是如何管理客户端的并发性。与使用相同的HttpClient实例不同,这与它使用的executor服务有很大关系,您可以定制该服务(请参阅这里 )。

代码语言:javascript
运行
复制
ExecutorService executorService = Executors.newFixedThreadPool(10);
HttpClient httpClient  = HttpClient.newBuilder()
                               .executor(executorService)
                               ... //more config
                               .build();

通过这种方式,您可以管理客户端用于运行异步请求的线程池。

换言之:

这做法不好吗?

不是

每个HttpRequest都应该有自己的HttpClient吗?

不是

HttpRequests的数量是否有HttpClient的上限?

您必须测试应用程序的最佳并发设置,然后使用相应配置的executor服务。

票数 8
EN

Stack Overflow用户

发布于 2020-10-11 13:18:15

我要说的是线程的数量,而不是对象的数量,因为每个客户端都可以通过执行器的线程池使用许多线程,无论是显式声明的还是默认的线程池。所以真正的问题在于我们应该使用多少线程?这将取决于同步或异步请求的使用。

  1. 当使用send时,从池中使用的线程越多,我们就能够并行地提出更多请求,直到OS启动倾覆为止,也就是说,增加活动线程的数量实际上减少了完成的工作量。
  2. 在您的示例中使用sendAsync时,事情会变得有趣,因为它是一种非阻塞方法,这意味着同一个线程在等待进程响应时可以发出多个请求。在这种情况下,我建议将执行器池中的线程数量与处理器内核的数量保持相等。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64302936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档