在Java中,是否有一种编程方式可以找出CPU支持多少并发线程?
更新
为了澄清,我不是想用线程来锤击CPU,而是我知道Runtime.getRuntime()。availableProcessors()函数,它提供了我正在寻找的部分信息。
我想知道是否有办法自动调整线程池的大小,以便:
答案 0 :(得分:24)
Runtime.availableProcessors返回逻辑处理器(即硬件线程)的数量,而不是物理核心。请参阅CR 5048379。
答案 1 :(得分:19)
单个非超线程CPU核心始终可以运行一个线程。您可以生成许多线程,CPU将在它们之间切换。
最佳数量取决于任务。如果这是一项需要大量CPU资源且不需要任何I / O(如计算pi,素数等)的任务,那么每个CPU的1个线程可能是最好的。如果任务更多I / O绑定。比如从磁盘处理信息,那么每个CPU有多个线程可能会获得更好的性能。在这种情况下,磁盘访问可以在CPU处理来自先前磁盘读取的信息时进行。
我建议你做一些测试,了解你的情况下的性能如何与每个CPU核心的线程数一起扩展,并根据它来决定。然后,当您的应用程序运行时,它可以检查availableProcessors()
并确定它应该生成多少个线程。
超线程将使单核看起来像操作系统和所有应用程序,包括availableProcessors()
,作为2个CPU,因此如果您的应用程序可以使用超线程,您将获得好处。如果没有,那么性能会受到轻微影响,但可能还不足以为此付出额外的努力。
答案 2 :(得分:4)
没有标准的方法来获取Java中每个CPU核心支持的线程数。最好的办法是获得一个Java CPUID实用程序,它为您提供处理器信息,然后将其与您必须生成的表进行匹配,从而为您提供处理器管理的每个核心的线程,而无需“真正的”上下文切换。 / p>
- 亚当
答案 3 :(得分:1)
CPU通常不会对线程数量造成限制,我认为Java本身对其产生的本机(内核)线程数量没有限制。
Runtime类中有一个方法availableProcessors()。这就是你要找的东西吗?
答案 4 :(得分:1)
基础: 加载到内存中的应用程序是进程。一个进程至少有1个线程。如果需要,您可以在进程中创建任意数量的线程(理论上)。因此线程数取决于您和您使用的算法。
如果使用线程池,则表示线程池管理线程数,因为创建线程会消耗资源。线程池回收线程。这意味着许多逻辑线程可以一个接一个地在一个物理线程内运行。
您不必考虑线程数,它由线程池算法管理。线程池为服务器和桌面计算机(操作系统)选择不同的算法。
<强> EDIT1: 强> 如果您认为线程池不使用您拥有的资源,则可以使用显式线程。在这种情况下,您可以明确地管理线程数。
答案 5 :(得分:1)
每个处理器或处理器核心一次只能做一件事。对于超线程,事情会有所不同,但大多数情况仍然如此,这就是为什么我的HT机器在工作时几乎从不超过50%,即使它在100%时,它也不是一次处理两倍。
您可能只需要对计划部署的常见体系结构进行一些测试,以确定要在每个CPU上运行多少个线程。如果您正在等待大量I / O,那么仅使用1个线程可能会太慢。运行大量线程会降低速度,因为处理器必须更频繁地切换线程,这可能会非常昂贵。我不确定是否有任何硬编码限制你可以运行多少线程,但我保证你的应用程序可能会在你达到任何硬限制之前从过多的线程切换中爬行。最后,您应该将其作为配置文件中的一个选项,以便您可以轻松地将应用程序调整到您正在运行它的任何处理器上。
答案 6 :(得分:0)
这是VM的功能,而不是CPU的功能。它与每个线程消耗的堆量有关。当堆上的空间不足时,就完成了。与其他海报一样,如果由于线程数而超出堆空间,我怀疑您的应用在此之前变得无法使用。
请参阅此discussion。