Опция 1:
newWorkStealingPool изExecutors
public static ExecutorService newWorkStealingPool()
Создает пул потоков, требующих трудозатрат, используя все доступные процессоры в качестве целевого уровня параллелизма.
С этим API вам не нужно передавать количество ядер ExecutorService
.
Реализация этого API из grepcode
/**
* Creates a work-stealing thread pool using all
* {@link Runtime#availableProcessors available processors}
* as its target parallelism level.
* @return the newly created thread pool
* @see #newWorkStealingPool(int)
* @since 1.8
*/
public static ExecutorService newWorkStealingPool() {
return new ForkJoinPool
(Runtime.getRuntime().availableProcessors(),
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null, true);
}
Вариант 2:
newFixedThreadPool API из Executors
или other newXXX constructors
, который возвращаетExecutorService
public static ExecutorService newFixedThreadPool(int nThreads)
замените nThreads на Runtime.getRuntime().availableProcessors()
Вариант 3:
ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
передать Runtime.getRuntime().availableProcessors()
как параметр в maximumPoolSize
.