public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
在JAVA多任務並行執行的開發過程中,筆者有一點疑惑
corePoolSize maximumPoolSize 這幾個參數跟OS具體關系是什么呢?
我們還是先梳理一下JAVA進程的線程與內核的線程關系,就能知曉大概了。
從JMM層面 JVM線程其實是使用了內核線程的一個高級接口即所謂輕量級進程【是有內核實現的】的概念與系統內核線程(每個內核線程視為內核的一個分身)一比一的關系來執行任務邏輯,從用戶態到內核態的過程后, 內核通過操縱調度器對線程進行分配資源,負責將任務給各個處理器上處理執行;因此創建線程的過程會消耗一定的系統資源,因此一個系統支持的輕量級進程數量是有限的。
所以這個線程數還是受限於OS層面的線程數,明白這個就OK。所以最大線程數不是越大越好 過大也沒什么作用還是要根據OS本身的參數進行適配。
像上面的corePoolSize如果處理的各個任務理論上馬上就能完成 其實不用設置的過大,盡量復用線程
maximumPoolSize最大就是OS內核線程數 超過這個也沒什么意義
下面是OS層面的一些概念 可以了解一下 ;知道一下超線程等概念
簡單地說,CPU的核心數是指物理上,也就是硬件上存在着幾個核心。比如,雙核就是包括2個相對獨立的CPU核心單元組,四核就包含4個相對獨立的CPU核心單元組,等等,依次類推。
線程數是一種邏輯的概念,簡單地說,就是模擬出的CPU核心數。比如,可以通過一個CPU核心數模擬出2線程的CPU,也就是說,這個單核心的CPU被模擬成了一個類似雙核心CPU的功能。我們從任務管理器的性能標簽頁中看到的是兩個CPU。
比如Intel 賽揚G460是單核心,雙線程的CPU,Intel 酷睿i3 3220是雙核心 四線程,Intel 酷睿i7 4770K是四核心 八線程 ,Intel 酷睿i5 4570是四核心 四線程等等。
對於一個CPU,線程數總是大於或等於核心數的。一個核心最少對應一個線程,但通過超線程技術,一個核心可以對應兩個線程,也就是說它可以同時運行兩個線程。
CPU的線程數概念僅僅只針對Intel的CPU才有用,因為它是通過Intel超線程技術來實現的,最早應用在Pentium4上。如果沒有超線程技術,一個CPU核心對應一個線程。所以,對於AMD的CPU來說,只有核心數的概念,沒有線程數的概念。
CPU之所以要增加線程數,是源於多任務處理的需要。線程數越多,越有利於同時運行多個程序,因為線程數等同於在某個瞬間CPU能同時並行處理的任務數。
在Windows中,在cmd命令中輸入“wmic”,然后在出現的新窗口中輸入“cpu get *”即可查看物理CPU數、CPU核心數、線程數。其中,
Name:表示物理CPU數
NumberOfCores:表示CPU核心數
NumberOfLogicalProcessors:表示CPU線程數
在Java中通過Runtime.getRuntime().availableProcessors();獲得OS線程數,
查看電腦支持的核心數和線程數在電腦上也能看,通過查看電腦屬性選項即可