2016-04-13 232 views
1

我想知道是否有人能告訴我,當你擁有比內核更多的線程時,java如何處理多線程?例如,我有一個四核心,但我的程序使用8個線程。java如何處理多線程?比進程更多的線程

我只是問,因爲我想做一些並行編程。我想用它來提高數組的性能。

感謝您的任何幫助。

編輯: 爲了澄清,我將使用並行編程通過核心數來劃分陣列。所以我有一個大約50K的數組,並希望使用PP來提高性能並增加數組大小。

+0

而且我有一個創建1000個線程的性能測試腳本。一個CPU可以運行多個線程,但據我所知,一次只能有一個線程佔用一個CPU(但2個線程可以同時在兩個CPU上運行)。操作系統處理資源分配(CPU使用率,RAM等)。不過,這與語言無關。 –

+0

但是,即使使用1個CPU,通常多線程仍然更快。 –

+0

@btquanto除非您的CPU有1000個內核(或500個帶超線程的內核),否則啓動1000個線程不會使您的程序運行得更快。這些線程中的大多數將等待,直到它們被安排。只需添加更多線程不會自動使程序運行得更快。 – Jesper

回答

4

可以讓我知道java中如何處理多線程

它沒有(除非你有綠色的線,最likley你不這樣做)。操作系統執行調度。

我有一個四核,但我的程序使用8個線程。

如果您有超線程,它們都可以一次運行。順便說一句,對於GC來說,每個CPU可能只有1個線程,除此之外,還有許多其他線程,即使您自己沒有創建任何線程。

我想做一些並行編程。想用它來提高陣列的性能

我建議你保持繁忙的線程數量,你有邏輯CPU的數量。事實上,有一個圖書館可以幫助你做這個builtin例如DoubleStream

double[] manyDoubles = .... 
DoubleSummaryStatistics dss = 
      DoubleStream.of(manyDouble) 
         .parallel()// do stuff in parallel using all the CPUS 
         .filter(x -> x >= 1) 
         .map(x -> x * x) 
         .summaryStatistics(); 
+0

感謝您的回答。四核和8線程就是一個例子,只是爲了幫助解釋我的觀點。但感謝幫助:)認爲我明白。謝謝你 – DatAssKyle

+0

@DatAssKyle如果可以的話,首先以平行流開始。這將有效地使用您擁有的所有CPU,代碼也將更加簡單。 –