Почему CompletableFuture.runAsync() не всегда подчиняется ForkJoinPool.commonPool()?

CompletableFuture.runAsync указано:

Возвращает новый CompletableFuture, который асинхронно завершается задачей, запущенной в ForkJoinPool.commonPool() после выполнения данного действия.

Однако, насколько я могу судить, runAsync отправляет задачу ForkJoinPool.commonPool() только тогда, когда ForkJoinPool.getCommonPoolParallelism() > 1. Если нет, он вручную создает новый Thread для каждой отправленной задачи.

Почему именно так?


person Christian S.    schedule 20.12.2019    source источник


Ответы (1)


Да, если уровень параллелизма ForkJoinPool меньше 2, то для каждой задачи создается новый поток здесь

Все асинхронные методы без явного аргумента Executor выполняются с использованием ForkJoinPool.commonPool() (если только он не поддерживает уровень параллелизма не менее двух, и в этом случае для запуска каждой задачи создается новый поток).< /сильный>

person Deadpool    schedule 20.12.2019
comment
Я это понимаю, но хотелось бы уточнить, почему было бы лучше (при условии, что это так, поскольку это было реализовано таким образом) создавать новые потоки в случае, если уровень параллелизма не превышает 1 (поэтому по умолчанию, когда у вас есть одно или два логических ядра). - person Christian S.; 20.12.2019