鍍金池/ 問答/Java  Linux/ JAVA的多個(gè)線程可以同時(shí)在CPU的多個(gè)核心上運(yùn)行么?

JAVA的多個(gè)線程可以同時(shí)在CPU的多個(gè)核心上運(yùn)行么?

現(xiàn)在的電腦cpu 都是多核,CPU對(duì)于各個(gè)線程的調(diào)度是隨機(jī)的(分時(shí)調(diào)度),如果程序中 開啟了多個(gè)線程,那么這幾個(gè)線程是分別同時(shí)運(yùn)行在不同的核心上呢,還是由于 JVM對(duì)線程的調(diào)度,使得 這幾個(gè)線程 分時(shí) 跑在一個(gè)核心上呢?

搜了半天 但是都是有些模棱兩可 ,只好特來請(qǐng)教,謝謝!

回答
編輯回答
別瞎鬧

給你個(gè)明確的說法:是跑在多核心上的。當(dāng)然中間還有一大堆調(diào)用鏈、各種模型、操作系統(tǒng)、JVM的知識(shí),但這些對(duì)你這個(gè)問題不重要。粗淺的理解,就當(dāng)是多個(gè) java 線程同時(shí)塞到 CPU 里面去;一個(gè)線程像面條一樣插在一個(gè) cpu 核心孔里,然后從這頭拉出來(完成計(jì)算),就行了。

而且我猜測你要解決的問題,可以使用多線程去做,放心大膽去做,是能達(dá)到你要的最終結(jié)果的。但一般并不是線程越多越好,對(duì)于解決一個(gè)整體的計(jì)算問題,最終僅是一次計(jì)算而想得到整體結(jié)果的情況,我們一般的做法,是開的線程數(shù)量等于 CPU 的核心數(shù)量,這樣可以減少不必要的資源切換從而更利于效率。

那么,對(duì)于解決整體中含有不定量個(gè)體的問題,你可以先把整體數(shù)量除以 CPU 核心數(shù)量,得到一個(gè)進(jìn)位整數(shù),然后對(duì)集合進(jìn)行數(shù)量切割,每個(gè)小組再啟動(dòng)一個(gè)線程去處理,最后合并結(jié)果集。

當(dāng)然,這種情況下,你如果能使用 java 的 forkjoin 框架來解決,會(huì)優(yōu)雅很多。

https://www.roncoo.com/articl...

2017年6月1日 23:58