cpu多線程和jvm多線程?
一 cpu個數(shù)、核數(shù)、線程數(shù)的關(guān)系
cpu個數(shù):是指物理上,也及硬件上的核心數(shù);
核數(shù):是邏輯上的,簡單理解為邏輯上模擬出的核心數(shù);一個CPU核心數(shù)模擬出2線程的CPU
線程數(shù):是同一時刻設(shè)備能并行執(zhí)行的程序個數(shù),線程數(shù)=cpu個數(shù) * 核數(shù),及程數(shù)=cpu個數(shù)(2) * 核數(shù)(2)=4
Windows: wmic 然后 物理CPU數(shù) “cpu get NumberOfCores”, CPU核心數(shù) “cpu get NumberOfLogicalProcessors”
Linux:
查看CPU個數(shù) cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
查看核數(shù) cat /proc/cpuinfo| grep "cpu cores"| uniq
二 cpu線程數(shù)和Java多線程
(1) 線程是CPU級別的,單個線程同時只能在單個cpu線程中執(zhí)行
(2) Java多線程并不是由于cpu線程數(shù)為多個才稱為多線程,當(dāng)Java線程數(shù)大于cpu線程數(shù),操作系統(tǒng)使用時間片機(jī)制,采用線程調(diào)度算法,頻繁的進(jìn)行線程切換。
(3) 線程是操作系統(tǒng)最小的調(diào)度單位,進(jìn)程是資源(比如:內(nèi)存)分配的最小單位
(4)Java中的所有線程在JVM進(jìn)程中,CPU調(diào)度的是進(jìn)程中的線程
線程的調(diào)度是指按照特定的機(jī)制為多個線程分配CPU的使用權(quán)。有兩種調(diào)度模型:分時調(diào)度模型和搶占式調(diào)度模型
分時調(diào)度模型是指讓所有線程輪流獲得CPU的使用權(quán),并且平均分配每個線程占用CPU的時間片。
Java虛擬機(jī)采用搶占式調(diào)度模型,是指優(yōu)先讓可運(yùn)行池中處于就緒態(tài)的線程中優(yōu)先級高的占用CPU,如果可運(yùn)行池中線程的優(yōu)先級相同,那么就隨機(jī)選擇一個線程,使其占用CPU,處于運(yùn)行狀態(tài)的線程會一直執(zhí)行,直至它不得不放棄CPU,一個線程會因?yàn)橐韵略蚍艞塁PU:
(1)Java虛擬機(jī)讓當(dāng)前線程暫時放棄CPU,轉(zhuǎn)到就緒態(tài),使其他線程獲得運(yùn)行機(jī)會
(2)當(dāng)前線程因?yàn)槟承┰蚨幱谧枞麪顟B(tài)
(3)線程運(yùn)行結(jié)束
Java線程讓步:
3. Thread.yield()方法
就是說當(dāng)一個線程使用了這個方法之后,它就會把自己CPU執(zhí)行的時間讓掉,讓自己或者其它的線程運(yùn)行,注意是讓自己或者其他線程運(yùn)行(根據(jù)CPU的調(diào)度),并不是單純的讓給其他線程。
4.等待其他線程結(jié)束:join()
當(dāng)前運(yùn)行的線程可以調(diào)用另一個線程的join()方法,當(dāng)前運(yùn)行的線程將轉(zhuǎn)到阻塞狀態(tài),直至另一個線程運(yùn)行結(jié)束,它才會恢復(fù)運(yùn)行(阻塞恢復(fù)到就緒)