【问题标题】:How does java handle multithreading? more threads than processes [closed]java如何处理多线程?线程多于进程[关闭]
【发布时间】:2016-04-13 07:14:19
【问题描述】:

我想知道是否有人可以告诉我,当线程数多于内核数时,java 如何处理多线程?例如,我有一个四核,但我的程序使用了 8 个线程。

我只是问,因为我想做一些并行编程。我想用它来提高数组的性能。

感谢您的帮助。

编辑: 澄清一下,我将使用并行编程来按内核数划分数组。所以我有一个50K左右的数组,希望能用PP来提高性能,增加数组大小。

【问题讨论】:

  • 我有一个创建 1000 个线程的性能测试脚本。一个CPU可以运行多个线程,但据我了解,一次只能有一个线程占用一个CPU(但2个线程可以同时在2个CPU上运行)。操作系统处理资源的分配(CPU 使用率、RAM 等)。不过,这与语言无关。
  • 但是,即使有 1 个 CPU,多线程通常仍然更快。
  • @btquanto 除非您的 CPU 有 1000 个内核(或具有超线程的 500 个内核),否则启动 1000 个线程不会让您的程序运行得更快。这些线程中的大多数将等待它们被调度。仅仅添加更多线程并不会自动使程序运行得更快。
  • @Jesper 因为线程是由操作系统调度的,所以它不仅仅运行你程序的线程。假设操作系统有 9000 个线程在运行,而你的程序只是增加了 1000 个线程,如果我假设每个线程具有相同的优先级,是不是意味着你的程序总共占用了 10% 的资源?
  • @btquanto 不,这取决于线程在做什么。如果这 9000 个操作系统线程正在等待 I/O,那么您的应用程序线程可能会在那个时间点使用 99% 的 CPU。

标签: java multithreading parallel-processing


【解决方案1】:

可以告诉我java是如何处理多线程的

它没有(除非你有绿色线程,而且很可能你没有)。操作系统进行调度。

我有一个四核,但我的程序使用 8 个线程。

如果您有超线程,它们可以同时运行。顺便说一句,您可能每个 CPU 有 1 个线程仅用于 GC,还有许多其他线程,即使您自己没有创建任何线程。

我想做一些并行编程。想用它来提高数组的性能

我建议您将繁忙线程的数量与您拥有的逻辑 CPU 的数量保持一致。事实上,有一个库可以帮助你做到这一点,例如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();

【讨论】:

  • 感谢您的回答。四核和 8 线程就是一个例子,只是为了帮助解释我的观点。但感谢您的帮助:) 我想我明白了。谢谢你
  • @DatAssKyle 如果可以的话,首先从并行流开始。这将有效地使用您拥有的所有 CPU,并且代码也将更加简单。
猜你喜欢
  • 1970-01-01
  • 2019-02-27
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多