每个处理器的线程数

Leo*_*Leo 25 java concurrency

在Java中,是否有一种编程方式可以找出CPU支持多少并发线程?

更新

为了澄清,我不是试图用线程来锤击CPU,而是我知道Runtime.getRuntime().availableProcessors()函数,它提供了我正在寻找的部分信息.

我想知道是否有办法自动调整线程池的大小,以便:

  • 如果我在1岁的服务器上运行,我会得到2个线程(每个CPU 1个线程x 2个任意乘数)
  • 如果我从现在开始两年后切换到Intel i7四核(每个核心支持2个线程),我会得到16个线程(每个CPU 2个逻辑线程x 4个CPU x 2个任意乘数).
  • 相反,如果我使用八核Ultrasparc T2服务器(每个核心支持8个线程),我得到128个线程(每个CPU 8个线程x 8个CPU x 2个任意乘数)
  • 如果我在可能在不同年份购买的30台不同机器的集群上部署相同的软件,我不需要读取CPU规格并为每一台机器设置配置选项.

Tom*_*ine 25

Runtime.availableProcessors返回逻辑处理器(即硬件线程)的数量,而不是物理核心.见CR 5048379.


pip*_*eek 19

单个非超线程CPU核心总是可以运行一个线程.您可以生成许多线程,CPU将在它们之间切换.

最佳数量取决于任务.如果这是一项需要大量CPU资源且不需要任何I/O(如计算pi,素数等)的任务,那么每个CPU的1个线程可能是最好的.如果任务更多I/O绑定.比如从磁盘处理信息,那么每个CPU有多个线程可能会获得更好的性能.在这种情况下,磁盘访问可以在CPU处理来自先前磁盘读取的信息时进行.

我建议你做一些测试,测试你的情况下的性能如何随每个CPU核心的线程数量而变化,并根据它来决定.然后,当您的应用程序运行时,它可以检查availableProcessors()并确定它应该生成多少个线程.超线程将使单核看起来像操作系统和所有应用程序,包括availableProcessors()2个CPU,因此如果您的应用程序可以使用超线程,您将获得好处.如果没有,那么性能会受到轻微影响,但可能还不足以为此付出额外的努力.

  • Intel HT将显示从availableProcessors返回的值.如果你有一个带HT的双核CPU,那么availableProcessors将返回4. (5认同)

Jes*_*erE 1

CPU 通常不会对线程数量造成限制,而且我认为 Java 本身对其生成的本机(内核)线程数量也没有限制。

Runtime 类中有一个方法availableProcessors() 。这就是您要找的吗?