我正在试验来自 jdk 9-ea+171
的 HTTP/2
客户端。代码取自this example :
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://www.google.com/"))
.build();
HttpResponse<String> response
= client.send(request, HttpResponse.BodyHandler.asString());
但是客户端永远卡在最后一行。请指教如何修复它?
调试显示它在方法 waitUntilPrefaceSent()
中无限等待。
最佳答案
这是最新构建的 HTTP2 连接实现中的错误。它不会发生在以前的版本中。
首先需要指定GET
方法,避免获取空指针异常。
发生的事情是主线程正在等待发送连接序言。它锁定一个倒计时锁存器以等待接收此序言。为了唤醒自己,任何 HttpClient
都会创建一个帮助线程来读取传入的流量。这个线程应该唤醒主线程,但有时,这永远不会发生。如果您经常运行您的示例,您会发现这有时会奏效。我想有一场阅读序言的竞赛。
不幸的是,前言的读取也不考虑任何超时,所以除了中断主线程之外,没有办法唤醒主线程。
关于Java 9 HttpClient 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44266022/