簡體   English   中英

CompletableFuture thenAccept 不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM