[英]Why CompletableFuture 's thenAccept() not running on the main thread
[英]CompletableFuture thenAccept does not work
歡迎,我很困惑為什么這部分代碼不起作用。
public class Main {
public static void main(String[] args) throws URISyntaxException {
final String URL = "https://jsonplaceholder.typicode.com/users/1";
HttpRequest request = HttpRequest.newBuilder(new URI(URL)).GET().timeout(Duration.of(10, ChronoUnit.SECONDS)).build();
HttpClient.newHttpClient().sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenAcceptAsync(r -> {
System.out.println(r.statusCode());
System.out.println(Thread.currentThread().getName());
}, Executors.newFixedThreadPool(10));
System.out.println("END OF PROGRAM");
}
}
結果是:
END OF PROGRAM
如果我提供了 ExecutorService JVM 應該等待 CompletableFuture 完成(.thenAceptAsync 部分)但程序立即完成。
大概是我的心態錯了。 有人可以解釋一下嗎?
程序在請求完成之前退出。 該請求使用sendAsync
異步執行,因此它不會阻止程序的執行。
要阻止執行並等待 API 響應,您必須使用response.get();
如下:
public static void main(String[] args) throws URISyntaxException, ExecutionException,
InterruptedException {
final String URL = "https://jsonplaceholder.typicode.com/users/1";
HttpRequest request = HttpRequest.newBuilder(new URI(URL)).GET().timeout(Duration.of(10, ChronoUnit.SECONDS)).build();
CompletableFuture<Void> response = HttpClient.newHttpClient()
.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenAcceptAsync(r -> {
System.out.println(r.statusCode());
System.out.println(Thread.currentThread().getName());
}, Executors.newFixedThreadPool(10));
response.get();//wait for API response
System.out.println("END OF PROGRAM");
}
Output:
200
pool-1-thread-1
END OF PROGRAM
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.