Java-HttpClient不释放线程

Java-HttpClient不释放线程,java,java-11,maven-exec-plugin,Java,Java 11,Maven Exec Plugin,我正在使用Java11的内置HTTP客户机,并且面临一个奇怪的问题,即客户机没有释放线程。我有以下代码: publicstaticvoidmain(String[]args)抛出InterruptedException、IOException、URISyntaxException{ HttpClient client=HttpClient.newBuilder().followRedirects(HttpClient.Redirect.ALWAYS.build(); HttpResponse响应

我正在使用Java11的内置HTTP客户机,并且面临一个奇怪的问题,即客户机没有释放线程。我有以下代码:

publicstaticvoidmain(String[]args)抛出InterruptedException、IOException、URISyntaxException{
HttpClient client=HttpClient.newBuilder().followRedirects(HttpClient.Redirect.ALWAYS.build();
HttpResponse响应;
HttpRequest请求=HttpRequest.newBuilder().uri(新uri(“http://127.0.0.1:4321)标题(“内容类型”、“应用程序/json”)
.POST(HttpRequest.bodypublisher.ofString(“{}”).build();
response=client.send(请求,HttpResponse.BodyHandlers.discarding());
}
我使用maven的exec插件运行应用程序,但出现以下错误:

[WARNING] thread Thread[HttpClient-1-Worker-0,5,com.example.httpclient.App] was interrupted but is still alive after waiting at least 14995msecs
[WARNING] thread Thread[HttpClient-1-Worker-0,5,com.example.httpclient.App] will linger despite being asked to die via interruption
[WARNING] thread Thread[HttpClient-1-Worker-1,5,com.example.httpclient.App] will linger despite being asked to die via interruption
[WARNING] thread Thread[HttpClient-1-Worker-2,5,com.example.httpclient.App] will linger despite being asked to die via interruption
[WARNING] NOTE: 3 thread(s) did not finish despite being asked to  via interruption. This is not a problem with exec:java, it is a problem with the running code. Although not serious, it should be remedied.
[WARNING] Couldn't destroy threadgroup org.codehaus.mojo.exec.ExecJavaMojo$IsolatedThreadGroup[name=com.example.httpclient.App,maxpri=10]
客户端似乎没有正确地释放线程。有趣的是,如果我注释掉发送请求的代码(同时保留创建客户机的代码),那么上述警告就会消失

如果我在末尾添加
System.exit(0)
,那么警告也会消失,但我仍然想知道为什么内置客户端会出现这种情况?在客户端、请求或响应上没有close方法,因此我认为我没有泄漏资源


我甚至将客户机设置为null,并手动调用GC,即使问题仍然存在。非常混乱。

HttpClient使用一个内部线程池和守护进程线程。当线程池被垃圾收集时,客户端似乎没有显式关闭它

您看到的警告与maven插件设置的基础结构有关。似乎其他人也经历过类似的问题(例如,参见)

抑制警告的一种可能的解决方法是向
HttpClient.Builder
提供一个
Executor
,然后在主方法中关闭该
Executor


对于该记录,如果未向
HttpClient.Builder
提供执行器,则
HttpClient
将使用返回的执行器。

HttpClient将使用具有守护进程线程的内部线程池。当线程池被垃圾收集时,客户端似乎没有显式关闭它

您看到的警告与maven插件设置的基础结构有关。似乎其他人也经历过类似的问题(例如,参见)

抑制警告的一种可能的解决方法是向
HttpClient.Builder
提供一个
Executor
,然后在主方法中关闭该
Executor

对于记录,如果未向
HttpClient.Builder
提供执行器,则
HttpClient
将使用由返回的执行器