Я сравниваю поведение CompletableFuture.supplyAsync () в двух случаях, когда я устанавливаю пользовательскую службу ExecutorService или я хочу, чтобы мой поставщик выполнялся исполнителем по умолчанию(если не указано), которое ForkJoinPool.commonPool ()
Давайте посмотрим на разницу:
public class MainApplication {
public static void main(final String[] args) throws ExecutionException, InterruptedException {
Supplier<String> action1 = () -> {
try {
Thread.sleep(3000);
}finally {
return "Done";
}
};
Function<String, String> action2 = (input) -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
return input + "!!";
}
};
final ExecutorService executorService = Executors.newFixedThreadPool(4);
CompletableFuture.supplyAsync(action1, executorService)
.thenApply (action2)
.thenAccept (res -> System.out.println(res));
System.out.println("This is the end of the execution");
}
}
В этом случае яПередача executorService в мой supplyAsync (), и он печатает:
Это конец выполнения
Готово !!
Итак «Готово» печатается после окончания основного исполнения.
НО, если я использую вместо:
CompletableFuture.supplyAsync(action1)
, поэтому я не передаю свой обычайexecutorService и класс CompletableFuture используют под капотом ForkJoinPool.commonPool () , тогда «Done» вообще не печатается:
Это конец выполнения
Процесс завершен с кодом выхода 0
Почему?