Java OpenJDK 11';HttpClient的原因“;“打开的文件太多”;创建多个实例时发生异常

Java OpenJDK 11';HttpClient的原因“;“打开的文件太多”;创建多个实例时发生异常,java,Java,我试图通过以下链接中的示例使用JDK 11中的HttpClient。我的代码只是多次调用API。如下所示: for(int x=0; x < 3000; ++x) { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://example.com/")) .build();

我试图通过以下链接中的示例使用JDK 11中的HttpClient。我的代码只是多次调用API。如下所示:

for(int x=0; x < 3000; ++x) {
   HttpClient client = HttpClient.newHttpClient();
   HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("http://example.com/"))
      .build();
   client.sendAsync(request, BodyHandlers.ofString())
      .thenApply(HttpResponse::body)
      .thenAccept(System.out::println);
}
我在Ubuntu 18.04.1上运行它,文件句柄限制=1024


我发现如果我创建一次
HttpClient
实例,问题就解决了。但是在我的项目的很多地方我都需要这个
HttpClient
,我不想为它创建一个全局变量。有没有一种方法可以创建本地
HttpClient
而不会导致此问题?

您需要同时打开数千个到其他服务的连接?只要确保……使用依赖注入框架,在需要的地方注入相同的HttpClient对象。@malejpavouk在Ubuntu上,大约需要100-200次迭代才能达到文件打开限制(我是1024次)。@ErwinBolwidt感谢您的建议。但部分代码在一个共享库中,我计划将其用于其他项目。我不确定是否可以避免库中的DI。
java.lang.InternalError: java.io.IOException: Too many open files
    at java.net.http/jdk.internal.net.http.HttpClientImpl.<init>(HttpClientImpl.java:311)
    at java.net.http/jdk.internal.net.http.HttpClientImpl.create(HttpClientImpl.java:253)
    at java.net.http/jdk.internal.net.http.HttpClientBuilderImpl.build(HttpClientBuilderImpl.java:135)
    at java.net.http/java.net.http.HttpClient.newHttpClient(HttpClient.java:158)
...