一 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()方法,當前運行的線程將轉到阻塞狀態,直至另一個線程運行結束,它才會恢復運行(阻塞恢復到就緒)
參考
https://blog.csdn.net/qq_35529801/article/details/78699867
https://www.cnblogs.com/timxgb/p/9507316.html