作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据this,以下代码段应为Async。
因此,输出应显示为:TP1,TP2,TP3,http://openjdk.java.net/。
但是,当我运行它时,我得到:TP1,TP2,http://openjdk.java.net/,TP3。
似乎“sendAsync”正在阻止主线程。这不是我从异步方法中获得的期望。
难道我做错了什么?
public static void main(String[] args) {
HttpClient client = HttpClient.newHttpClient();
System.out.println("TP1");
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://openjdk.java.net/"))
.build();
System.out.println("TP2");
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::uri)
.thenAccept(System.out::println)
.join();
System.out.println("TP3");
}
最佳答案
解释
您调用join()
,它将显式等待并阻塞,直到将来完成。
从CompletableFuture#join:
Returns the result value when complete, or throws an (unchecked) exception if completed exceptionally. [...]
Waits if necessary for this future to complete, and then returns its result.
System.out.println("TP2");
var task = client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::uri)
.thenAccept(System.out::println);
System.out.println("TP3");
task.join(); // wait later
或永远不要等待。然后,您的主线程可能会更早死掉,但是只有在所有非守护程序线程都死了并且
HttpClient
用于异步任务的线程不是守护程序线程之后,JVM才会关闭。
关于java - Java异步HttpClient请求似乎阻塞了主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63998918/
有人可以向我澄清主线 DHT 规范中的声明吗? Upon inserting the first node into its routing table and when starting up th
我正在尝试使用 USB 小工具驱动程序使嵌入式设备作为 MTP 设备工作。 我知道 Android 从大容量存储设备切换到 MTP 设备已经有一段时间了,并且找到了 source code for M
我是一名优秀的程序员,十分优秀!