2016-04-13 193 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,代码也将更加简单。 –