欢迎,我很困惑为什么这部分代码不能工作。
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部分),但是程序马上就完成了。
也许我的心态是错的。有人能给我解释一下吗?
发布于 2022-01-02 19:31:36
程序在请求完成之前退出。请求是使用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");
}输出:
200
pool-1-thread-1
END OF PROGRAMhttps://stackoverflow.com/questions/70557933
复制相似问题