2013-10-01 58 views
1

我最近有機會聽取關於JVM的另一個討論。據稱,Java虛擬機在併發性方面做得很好。我找不到任何令人滿意的答案來解釋我認爲的一個簡單問題:當JVM運行多線程(因此使用多個虛擬內核,對嗎?)它是否利用了機器CPU的多個實際內核?JVM中的多個線程 - 它們何時使用多個內核?

我聽到「不總是」或「有時」作爲答案;那麼有什麼辦法可以確保當我們設計我們的代碼來運行多個線程時,JVM也會使用CPU的多個內核?或者換句話說,是什麼決定了JVM是否使用多核CPU核心呢?

我沒有真正能夠舉出一個什麼時候這是必要的例子,但我覺得它很有趣,因爲我知道設計師更喜歡在項目中確定所有東西。如果實際上它們永遠不會被並行計算,那麼在某些大型應用程序中有多個線程會有什麼意義呢?

回答

8

Java線程,像普通線程,可能被安排使用多個核心。關於併發編程的真正困難之處在於很難「強制」一個程序使用X個內核,並讓這個線程在這個內核上運行,等等。換句話說,就是確定性的。

它最終取決於操作系統,在某種意義上還取決於硬件。但在一天結束時,程序員應該抽象地考慮併發編程,並相信調度器正在完成其工作。

換句話說,是的。

2

在所有主流的現代jvms中,Java線程都是「真實」的操作系統線程,因此將像其他任何OS線程一樣在各個內核中進行調度。

+0

在這種情況下,JVM的每個線程的優先級是否與JVM本身的優先級相同? – 3yakuya

+3

@Byakuya你可以使用setPriority()來設置各個Java線程的優先級。這實際上意味着什麼取決於JVM和操作系統。 – pburka