CPU線程 和 Java線程


一 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

 


免責聲明!

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



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