When executing the following code:
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();
the result is the following:
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
However, when Executors.newWorkStealingPool(20) is replaced with Executors.newFixedThreadPool(20) all the requests are sent. What is the reason for this behavior?