2011-01-21 17 views
308

मैं जावा कोड के भीतर से अपने आवेदन के लिए उपलब्ध कोर की संख्या कैसे प्राप्त कर सकता हूं?जावा में कोरों की संख्या ढूँढना

+2

काफी सभी इरादों और उद्देश्य "कोर == प्रोसेसर" के लिए। –

+26

पूरी तरह से जावा का उपयोग कर मशीन को शारीरिक रूप से कठिन है, तो कोर की संख्या को ढूंढना मुश्किल है। स्टार्टअप पर जावा प्रोग्राम का उपयोग कर सकते हैं कोर की संख्या ढूँढना आसान है, * Runtime.getRuntime()। उपलब्ध प्रोसेसर() * का उपयोग करना आसान है। सीपीयू एफ़िनिटी सेट करने के लिए सभी प्रमुख आधुनिक ओएस की क्षमता के कारण (यानी एक आवेदन को केवल कुछ निश्चित कोर तक सीमित करें) यह ध्यान में रखना एक चिंता है। – SyntaxT3rr0r

+4

तार्किक या भौतिक कोर? एक महत्वपूर्ण अंतर है। –

उत्तर

523
int cores = Runtime.getRuntime().availableProcessors(); 

तो cores एक से भी कम है, या तो अपने प्रोसेसर के बारे में मरने के लिए है, या अपने JVM यह एक गंभीर बग है, या ब्रह्मांड के बारे में को उड़ाने की है।

+0

कोई बात नहीं, के बाद से 'Runtime' वर्ग से प्राप्त सूचनाओं का के सबसे अधिक है एक स्ट्रिंग, मैंने सोचा कि यह दिखाने में मददगार होगा कि यह एक 'int' देता है। –

+77

यह आपको तार्किक धागे की संख्या देगा। जैसे यदि आपके पास हाइपर-थ्रेडिंग है, तो यह कोर की संख्या दोगुनी होगी। –

+4

@ पीटर, हाँ, अच्छा बिंदु। मेरी आई 7 मशीन के साथ इस क्रिया को निष्पादित करते समय मैंने खुद को पहाड़ी का राजा महसूस किया! :) –

-2

यह Cygwin के साथ विंडोज पर काम करता है स्थापित:

System.getenv("NUMBER_OF_PROCESSORS")

+0

मैंने इसे आजमाया लेकिन शून्य वापस लौटा :( – Adelin

+0

मेरे पास सिगविन स्थापित है, लेकिन यह विंडोज शैल से काम करता है: '' groovy -e "println System.getenv ('NUMBER_OF_PROCESSORS')" '' –

+0

मुझे नहीं पता मेरे सिर के शीर्ष से बाहर अगर यह एक मानक विंडोज वातावरण चर है, लेकिन: '' '' NUMBER_OF_PROCESSORS'' मेरे लिए विंडोज कमांड लाइन से काम करता है। –

12

आप शारीरिक कोर आप cmd और टर्मिनल कमांड चला सकते हैं की संख्या प्राप्त करना चाहते हैं और फिर उत्पादन को पार्स करने के लिए आवश्यक जानकारी प्राप्त करने के लिए है। नीचे दिखाया गया फ़ंक्शन दिखाया गया है जो भौतिक कोर की संख्या देता है।

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 वर्ग:

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"; 
    } 
} 

}

+1

यह कोड का एक टुकड़ा है जो ओओपीड होने के लिए एक अच्छा उम्मीदवार है। :) –

+1

ओएसविलिएटर क्लास ओएसएक्स का समर्थन करता है, लेकिन getNumberOfCores पूरी तरह से इसे अनदेखा करता है। एक तरफ के रूप में, https://blog.opengroup.org/2015/10/02/mac-os-x-el-capitan-achieves-unix-certification/ तो 'मैक' आपके isUnix() में होना चाहिए लेकिन .. बीएसडी, ओएसएक्स के लिए, कोई lscpu कमांड मौजूद नहीं है और आपका getNumberOfCores 0 –

+1

लौटाएगा, लिनक्स पर, आपको "सॉकेट" द्वारा "एकाधिक सॉकेट प्रति" सॉकेट होना होगा। इसके अलावा, मैं नियमित अभिव्यक्तियों का उपयोग करता हूं। –

संबंधित मुद्दे