How do I find the number of cores available for an application from Java code?
#1 building
On Windows where Cygwin is installed, you can use:
System.getenv("NUMBER_OF_PROCESSORS")
#2 building
If you want to get the number of physical cores, run the cmd and terminal commands, and then parse the output to get the required information. The functions that return the number of physical cores are shown below.
private int getNumberOfCPUCores() { OsValidator osValidator = new OsValidator(); String command = ""; if(osValidator.isMac()){ command = "sysctl -n machdep.cpu.core_count"; }else if(osValidator.isUnix()){ command = "lscpu"; }else if(osValidator.isWindows()){ command = "cmd /C WMIC CPU Get /Format:List"; } Process process = null; int numberOfCores = 0; int sockets = 0; try { if(osValidator.isMac()){ String[] cmd = { "/bin/sh", "-c", command}; process = Runtime.getRuntime().exec(cmd); }else{ process = Runtime.getRuntime().exec(command); } } catch (IOException e) { e.printStackTrace(); } BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream())); String line; try { while ((line = reader.readLine()) != null) { if(osValidator.isMac()){ numberOfCores = line.length() > 0 ? Integer.parseInt(line) : 0; }else if (osValidator.isUnix()) { if (line.contains("Core(s) per socket:")) { numberOfCores = Integer.parseInt(line.split("\\s+")[line.split("\\s+").length - 1]); } if(line.contains("Socket(s):")){ sockets = Integer.parseInt(line.split("\\s+")[line.split("\\s+").length - 1]); } } else if (osValidator.isWindows()) { if (line.contains("NumberOfCores")) { numberOfCores = Integer.parseInt(line.split("=")[1]); } } } } catch (IOException e) { e.printStackTrace(); } if(osValidator.isUnix()){ return numberOfCores * sockets; } return numberOfCores; }
OSValidator class:
public class OSValidator { private static String OS = System.getProperty("os.name").toLowerCase(); public static void main(String[] args) { System.out.println(OS); if (isWindows()) { System.out.println("This is Windows"); } else if (isMac()) { System.out.println("This is Mac"); } else if (isUnix()) { System.out.println("This is Unix or Linux"); } else if (isSolaris()) { System.out.println("This is Solaris"); } else { System.out.println("Your OS is not support!!"); } } public static boolean isWindows() { return (OS.indexOf("win") >= 0); } public static boolean isMac() { return (OS.indexOf("mac") >= 0); } public static boolean isUnix() { return (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0 ); } public static boolean isSolaris() { return (OS.indexOf("sunos") >= 0); } public static String getOS(){ if (isWindows()) { return "win"; } else if (isMac()) { return "osx"; } else if (isUnix()) { return "uni"; } else if (isSolaris()) { return "sol"; } else { return "err"; } }
}
#3 building
int cores = Runtime.getRuntime().availableProcessors();
If there are fewer than one cores, the processor may be crashing, there may be a serious error in the JVM, or the Universe may be crashing.
#4 building
This is another way to find out the number of CPU cores (and a lot of other information), but this code requires additional dependencies:
Native operating system and hardware information https://github.com/oshi/oshi
SystemInfo systemInfo = new SystemInfo(); HardwareAbstractionLayer hardwareAbstractionLayer = systemInfo.getHardware(); CentralProcessor centralProcessor = hardwareAbstractionLayer.getProcessor();
Gets the number of logical CPU s available for processing:
centralProcessor.getLogicalProcessorCount();
#5 building
public class CPUCores { public static void main(String[] args) { int processors = Runtime.getRuntime().availableProcessors(); System.out.println("CPU cores: " + processors); } }
Output CPU core: 8
Note that this number is the total number of cores available for Java applications.
Refer to Java Doc API
Hyper threading