Варіант 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
.