一 cpu個數、核數、執行緒數的關係
cpu個數:是指物理上,也及硬體上的核心數;
核數:是邏輯上的,簡單理解為邏輯上模擬出的核心數;一個CPU核心數模擬出2執行緒的CPU
執行緒數:是同一時刻裝置能並行執行的程式個數,執行緒數=cpu個數 * 核數,及程數=cpu個數(2) * 核數(2)=4
Windows: wmic 然後 物理CPU數 “cpu get NumberOfCores”, CPU核心數 “cpu get NumberOfLogicalProcessors”
Linux:
檢視CPU個數 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
檢視核數 cat /proc/cpuinfo| grep "cpu cores"| uniq
二 cpu執行緒數和Java多執行緒
(1) 執行緒是CPU級別的,單個執行緒同時只能在單個cpu執行緒中執行
(2) Java多執行緒並不是由於cpu執行緒數為多個才稱為多執行緒,當Java執行緒數大於cpu執行緒數,作業系統使用時間片機制,採用執行緒排程演算法,頻繁的進行執行緒切換。
(3) 執行緒是作業系統最小的排程單位,程序是資源(比如:記憶體)分配的最小單位
(4)Java中的所有執行緒在JVM程序中,CPU排程的是程序中的執行緒
執行緒的排程是指按照特定的機制為多個執行緒分配CPU的使用權。有兩種排程模型:分時排程模型和搶佔式排程模型
分時排程模型是指讓所有執行緒輪流獲得CPU的使用權,並且平均分配每個執行緒佔用CPU的時間片。
Java虛擬機器採用搶佔式排程模型,是指優先讓可執行池中處於就緒態的執行緒中優先順序高的佔用CPU,如果可執行池中執行緒的優先順序相同,那麼就隨機選擇一個執行緒,使其佔用CPU,處於執行狀態的執行緒會一直執行,直至它不得不放棄CPU,一個執行緒會因為以下原因放棄CPU:
(1)Java虛擬機器讓當前執行緒暫時放棄CPU,轉到就緒態,使其他執行緒獲得執行機會
(2)當前執行緒因為某些原因而處於阻塞狀態
(3)執行緒執行結束
Java執行緒讓步:
3. Thread.yield()方法
就是說當一個執行緒使用了這個方法之後,它就會把自己CPU執行的時間讓掉,讓自己或者其它的執行緒執行,注意是讓自己或者其他執行緒執行(根據CPU的排程),並不是單純的讓給其他執行緒。
4.等待其他執行緒結束:join()
當前執行的執行緒可以呼叫另一個執行緒的join()方法,當前執行的執行緒將轉到阻塞狀態,直至另一個執行緒執行結束,它才會恢復執行(阻塞恢復到就緒)
一 cpu個數、核數、執行緒數的關係
cpu個數:是指物理上,也及硬體上的核心數;
核數:是邏輯上的,簡單理解為邏輯上模擬出的核心數;一個CPU核心數模擬出2執行緒的CPU
執行緒數:是同一時刻裝置能並行執行的程式個數,執行緒數=cpu個數 * 核數,及程數=cpu個數(2) * 核數(2)=4
Windows: wmic 然後 物理CPU數 “cpu get NumberOfCores”, CPU核心數 “cpu get NumberOfLogicalProcessors”
Linux:
檢視CPU個數 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
檢視核數 cat /proc/cpuinfo| grep "cpu cores"| uniq
二 cpu執行緒數和Java多執行緒
(1) 執行緒是CPU級別的,單個執行緒同時只能在單個cpu執行緒中執行
(2) Java多執行緒並不是由於cpu執行緒數為多個才稱為多執行緒,當Java執行緒數大於cpu執行緒數,作業系統使用時間片機制,採用執行緒排程演算法,頻繁的進行執行緒切換。
(3) 執行緒是作業系統最小的排程單位,程序是資源(比如:記憶體)分配的最小單位
(4)Java中的所有執行緒在JVM程序中,CPU排程的是程序中的執行緒
執行緒的排程是指按照特定的機制為多個執行緒分配CPU的使用權。有兩種排程模型:分時排程模型和搶佔式排程模型
分時排程模型是指讓所有執行緒輪流獲得CPU的使用權,並且平均分配每個執行緒佔用CPU的時間片。
Java虛擬機器採用搶佔式排程模型,是指優先讓可執行池中處於就緒態的執行緒中優先順序高的佔用CPU,如果可執行池中執行緒的優先順序相同,那麼就隨機選擇一個執行緒,使其佔用CPU,處於執行狀態的執行緒會一直執行,直至它不得不放棄CPU,一個執行緒會因為以下原因放棄CPU:
(1)Java虛擬機器讓當前執行緒暫時放棄CPU,轉到就緒態,使其他執行緒獲得執行機會
(2)當前執行緒因為某些原因而處於阻塞狀態
(3)執行緒執行結束
Java執行緒讓步:
3. Thread.yield()方法
就是說當一個執行緒使用了這個方法之後,它就會把自己CPU執行的時間讓掉,讓自己或者其它的執行緒執行,注意是讓自己或者其他執行緒執行(根據CPU的排程),並不是單純的讓給其他執行緒。
4.等待其他執行緒結束:join()
當前執行的執行緒可以呼叫另一個執行緒的join()方法,當前執行的執行緒將轉到阻塞狀態,直至另一個執行緒執行結束,它才會恢復執行(阻塞恢復到就緒)