Java8 中,默認創建線程池的方法多了一個——Executors.newWorkStealingPool(),
newWorkStealingPool 的文檔描述:
“Creates a work-stealing thread pool using all available processors as its target parallelism level.”
newWorkStealingPool 會創建一個含有足夠多線程的線程池,來維持相應的並行級別,它會通過工作竊取的方式,使得多核的 CPU 不會閒置,總會有活着的線程讓 CPU 去運行。
工作竊取概念(Work stealing)
工作竊取不是什麼 Java 獨有的東西,.NET 的 TPL 庫早就存在好幾年了。所謂工作竊取,指的是閒置的線程去處理本不屬於它的任務。
每個處理器核,都有一個隊列存儲着需要完成的任務。對於多核的機器來說,當一個核對應的任務處理完畢後,就可以去幫助其他的核處理任務。
Java
/** * 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); }
12345678910111213 | /*** 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);} |
---|
如上代碼 newWorkStealingPool 方法本質上就是一個 ForkJoinPool。但是 ForkJoinPool 是 java7 中就用的東西,所以 newWorkStealingPool 其實也不是什麼稀奇的東西。