Option 1:
newWorkStealingPool vonExecutors
public static ExecutorService newWorkStealingPool()
Erstellt einen Thread, der die Arbeit stiehlt, wobei alle verfügbaren Prozessoren als Zielparallelitätsstufe verwendet werden.
Mit dieser API müssen Sie nicht die Anzahl der Kerne übergeben ExecutorService
.
Implementierung dieser API aus 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);
}
Option 2:
newFixedThreadPool API von Executors
oder other newXXX constructors
, die zurückgibtExecutorService
public static ExecutorService newFixedThreadPool(int nThreads)
Ersetzen Sie nThreads durch Runtime.getRuntime().availableProcessors()
Option 3:
ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
geben Runtime.getRuntime().availableProcessors()
als Parameter an maximumPoolSize
.