gpt4 book ai didi

Java 11 HTTP 客户端自定义执行器线程池大小

转载 作者:太空宇宙 更新时间:2023-11-04 09:28:36 24 4
gpt4 key购买 nike

当向 Java 11 HTTP 客户端提供自定义执行器时,似乎存在 http 客户端运行所需的最小线程数,但此限制似乎没有记录或强制执行。

例如,以下代码只是挂起,或者更确切地说,请求永远不会完成:

    ThreadPoolExecutor executor = new ThreadPoolExecutor(0, 2, 60, TimeUnit.SECONDS, new SynchronousQueue<>());
HttpClient httpClient = HttpClient.newBuilder().executor(executor).build();

URI url = UriBuilder.fromUri("http://www.google.com").build();
HttpRequest request = HttpRequest.newBuilder()
.uri(url)
.GET()
.build();

httpClient
.sendAsync(request, BodyHandlers.ofString())
.thenAccept(response->{
System.out.println(response.body());
});

如果我提供 3 个线程,它就会成功完成。

我试图向客户端提供一个受限的线程池,因为我不希望它使用无限数量的线程。但我不知道线程池的要求是什么才能使客户端仍然正确运行。在此示例中,3 个就足够了,但我不知道其他示例是否需要更多。

我在任何地方都找不到任何可以解释这一点的文档,并且代码似乎没有强制执行任何限制,这意味着创建一个无法成功完成任何请求的 http 客户端似乎很容易。

我见过各种创建指定 5、6 个线程的自定义线程池的示例,但没有任何理由或解释限制线程池大小的明显危险。

我对可完成的 future 的内部工作原理了解不够,或者对 http 客户端本身的工作原理了解不够,无法推断任何给定任务可能需要多少线程,但我也不应该。

有人能透露一下吗?

最佳答案

如果您不在回调/相关操作/订阅者/发布者中执行任何阻塞操作,那么单个线程应该足够了 - 除非 HttpClient 实现中出现错误。然而,使用单个线程意味着如果您正在执行并发请求,那么工作必然会在某个时刻被序列化。

关于Java 11 HTTP 客户端自定义执行器线程池大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57389158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com