【发布时间】:2018-08-25 17:57:17
【问题描述】:
执行以下代码时:
ExecutorService executorService = Executors.newWorkStealingPool(20);
Function<String, CompletableFuture<String>> requestTask =
url -> CompletableFuture.supplyAsync(() -> {
System.out.println("Request " + requestCount++ + " was sent");
HttpClient.get(url);
return url;
}, executorService);
Function<String, String> extractName = s -> s.replaceAll("(https|http|://|\\.com|www\\.|\\.io)", "");
CompletableFuture[] futures = urls.stream() // urls list contains 14 urls
.map(requestTask)
.map(future -> future.thenApply(extractName))
.map(future -> future.thenAccept(System.out::println))
.toArray(CompletableFuture[]::new);
CompletableFuture.allOf(futures);
executorService.shutdown();
结果如下:
Request 0 was sent
Request 1 was sent
Request 2 was sent
Request 3 was sent
Request 4 was sent
Request 5 was sent
Process finished with exit code 0
但是,当Executors.newWorkStealingPool(20) 替换为Executors.newFixedThreadPool(20) 时,所有请求都会被发送。这种行为的原因是什么?
【问题讨论】:
标签: java concurrency executorservice completable-future