Java 8 對線程池有哪些改進?

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 其實也不是什麼稀奇的東西。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章