Если вы можете использовать ThreadPoolExecutor
напрямую, а не ExecutorService
из Executors
1 , то, возможно, существует более стандартный / поддерживаемый способ запуска всего ядрапотоки немедленно.
int nThreads = 200;
ThreadPoolExecutor executor = new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
executor.prestartAllCoreThreads();
Выше используется prestartAllCoreThreads()
.
Обратите внимание, что в настоящее время реализация Executors.newFixedThreadPool(int)
создает ThreadPoolExecutor
в точномтак же, как указано выше.Это означает, что вы можете технически привести ExecutorService
, возвращенный фабричным методом, к ThreadPoolExecutor
.В документации нет ничего, что гарантирует , однако это будет ThreadPoolExecutor
.
1.ThreadPoolExecutor
реализует ExecutorService
, но предоставляет больше функциональности.Кроме того, многие из фабричных методов в Executors
либо возвращают ThreadPoolExecutor
напрямую, либо обертку, которая делегируется одному.Некоторые, например newWorkStealingPool
, используют ForkJoinPool
.Опять же, возвращаемые типы этих фабричных методов являются деталями реализации, поэтому не слишком полагайтесь на них.