java線程與內核線程的關系,及怎么定義ThreadPoolExecutor相關參數


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線程數,

查看電腦支持的核心數和線程數在電腦上也能看,通過查看電腦屬性選項即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM