JAVA的線程可以在多個CPU上運行嗎?,javacpu
這個是我一個技術相當好的哥們去面試的時候碰到的奇葩問題,那天,這個面試官的答案是不能。後來就帶著這個問題去國內外的論壇上搜了一把,也是各說紛紜,實在是沒有一個統一的答案,簡直有點公說公有理,婆說婆有理的架勢。
幾個意見大致如下,第一,不能,因為“進程是CPU進行調度的單位,而JVM是一個進程,於是就只能跑在一個CPU上”。第二,“進程是CPU進行調度的單位,這沒錯,但是OS負責將一個進程在不同的CPU上調度到另外一個CPU上,而這個進程,則是由不同的線程構成的,那麼說,線程還是在不同的CPU上運行了”。我更傾向於第二種解釋,於是核心問題就變成了討論“JVM能不能夠將線程安排到不同的CPU上去運行呢?”。
最終,在SUN公司授權的《Java核心技術》,第7版卷II,第8版卷I,有關於“可運行線程”中,找到如下兩句話:
“今天,人們很可能有單台擁有多個CPU的電腦,但是,並發執行的進程數並不是CPU數目制約的。作業系統的時間片分配給每一個進程,給人平行處理的感覺”。
好吧,上面的這句話,並不能說明這個答案,但是當我看到下面的這句原話的時候,感覺答案就在這裡了:
"在具有多個處理器的機器上,每一個處理器運行一個線程,可以有多個線程並行運行。當然,如果線程的數目多於處理器的數目,調度器依然採用時間片機制"。這句話足以用來反駁那個出問題的人了,因為他的答案本身就是錯的。
儘管,盡信書不如無書,但是,還能有更好的選擇嗎?帶著這個問題,繼續走下去~ Fighting~ ziwen@163.com I enjoy PM、Java、Oracle. I'm an English lover as well~ ho ho~
後記:更詳細的資訊可以參見有關Java虛擬機器實現的“並發”系列講解,基本上每本關於Java虛擬機器有關的書籍以及官方文檔都會講到JVM如何?線程的幾種方式。 基於系統核心,基於使用者線程等等實現。JVM中的線程實現是本地化的~ 本地化的意思就是與平台有關了,儘管與平台有關,但是線程調度,仍舊是最佳高效的方式,有資料曾說過:線程的建立銷毀與調度的開銷是進程的三十分之一。
在java中,多線程真的是多個線程同時運行?
一個處理器(cpu)在某一個時間點上永遠都只能是一個線程!雙核cpu你可以理解為兩塊cpu,4核、8核等以此類推,就單個cpu而言某個時間點只能是一個線程在運行, 所謂的多線程是通過調度擷取cpu的時間片實現的 其實就相當於 cpu是一個人 多線程是幾件事 cpu一下子幹這件事 幹一會兒時間片到了就幹另一件 由於cpu計算速度很快很快 所以看起來就像幾件事情在同時做著 不過現在cpu都是雙核四核八核的 這些是真的一起乾的 因為這是幾個人幹幾件事 肯定是一起做的啦
不曉得這樣比喻你可以理解不 這樣不能理解我也麼有辦法啦
java中的線程與作業系統中的線程一樣,多線程是多個線程同時運行還是一個時間點運行一個線程?
從規範來說,線程就是java線程,你不需要直到是不是和作業系統的線程一樣,你也不應該知道,因為有些系統上是類比的,有些是直接使用作業系統的。
從實現來說,目前在多數系統上是一樣的。
宏觀來看是同一時間多個線程在運行,圍觀到cpu時間,那就是一個cpu時間內,只有一個線程在運行。
杜天微[權威專家]