在Java中有没有办法找出安装了多少CPU(或内核)?

在Java中有没有办法找出安装了多少CPU(或内核)?,java,runtime,system,Java,Runtime,System,我想对多线程程序进行一些调整 如果我知道有多少线程可以真正并行工作,我可以使程序更加有效 Java中有没有办法获取这些信息 在windows上肯定是。带有kernel32.dll的JNA。使用GetNativeSystemInfo调用中的SYSTEM\u INFO结构。还有dwNumberOfProcessors 我相信这将提供实际安装的处理器数量,而不是可用的数量您可以使用 Runtime.getRuntime().availableProcessors() 但它更多的是一个最佳猜测,甚至被

我想对多线程程序进行一些调整

如果我知道有多少线程可以真正并行工作,我可以使程序更加有效


Java中有没有办法获取这些信息

在windows上肯定是。带有kernel32.dll的JNA。使用
GetNativeSystemInfo
调用中的
SYSTEM\u INFO
结构。还有
dwNumberOfProcessors

我相信这将提供实际安装的处理器数量,而不是可用的数量

您可以使用

Runtime.getRuntime().availableProcessors()
但它更多的是一个最佳猜测,甚至被API提到

此值可能在虚拟机的特定调用期间更改 机器。对可用资源数量敏感的应用程序 因此,处理器应偶尔轮询此属性并进行调整 它们的资源使用是适当的

(代码片段能说出1000个单词)怎么样


关于availableProcessors()方法的一个注意事项是,它不区分物理CPU和虚拟CPU。e、 例如,如果您的计算机上启用了超线程,那么这个数字将是物理CPU数量的两倍(这有点令人沮丧)。不幸的是,在纯java中无法确定真实和虚拟CPU。

这是一个很好的问题!谢谢你的提问,这是一个相当困难(而且不可移植)的方法。同意,尽管它给出了处理器的数量。我只记得以前使用SYSTEM_INFO结构用于不同目的时的字段。+1-注意:这不会告诉应用程序安装了多少处理器/内核。但它确实告诉它JVM有多少可用。。。这正是OP真正需要的。@Stephen C:是的,我需要的正是这个。但是,你能给我一点启发吗:什么时候JVM可能无法使用所有处理器?@Roman:我想当操作系统为其他进程保留一些内核/处理器时,JVM将无法使用它们。
 public class Main {

 /**
  * Displays the number of processors available in the Java Virtual Machine
  */
 public void displayAvailableProcessors() {

    Runtime runtime = Runtime.getRuntime();

    int nrOfProcessors = runtime.availableProcessors();

    System.out.println("Number of processors available to the Java Virtual Machine: " + nrOfProcessors);

 }

 public static void main(String[] args) {
    new Main().displayAvailableProcessors(); 
 }
}