2015-08-26 23 views
5

मैं एक जावा प्रोग्राम पर काम कर रहा हूं जो ProcessBuilder का उपयोग कर बैच फ़ाइल चलाता है।उप-बाल प्रक्रिया में उच्च CPU लोड

public class Test { 

    public static void main(String[] args){ 
     try { 
      ProcessBuilder processBuilder = new ProcessBuilder("pathToMyBatch.bat"); 
      Process process = processBuilder.start(); 
      StreamReader fluxSortie = new StreamReader(process.getInputStream()); 
      StreamReader fluxErreur = new StreamReader(process.getErrorStream()); 
      new Thread(fluxSortie).start(); 
      new Thread(fluxErreur).start(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    static class StreamReader implements Runnable { 

     private final InputStream inputStream; 

     StreamReader(InputStream inputStream) { 
      this.inputStream = inputStream; 
     } 

     private BufferedReader getBufferedReader(InputStream is) { 
      return new BufferedReader(new InputStreamReader(is)); 
     } 

     @Override 
     public void run() { 
      BufferedReader br = getBufferedReader(inputStream); 
      String ligne = ""; 
      try { 
       while ((ligne = br.readLine()) != null) { 
        System.out.println(ligne); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

StreamReader वर्ग एक Runnable कि इनपुट के लिए प्रतीक्षा करें और हर पढ़ लाइन मुद्रित है।

थिबैच फ़ाइल java -classpath... पर कॉल करके बस एक अन्य जावा एप्लिकेशन लॉन्च करती है, और इस एप्लिकेशन से संबंधित अन्य सामग्री (और असंबंधित) करती है।

मैं इस बैच को संशोधित नहीं कर सकता।

यह स्पष्ट करने के लिए: कार्यक्रम A बैच फ़ाइल B जब मैं सीधे खिड़कियों से बैच फ़ाइल B चलाने के लिए, जावा आवेदन C मुश्किल से सीपीयू से अधिक 2% का उपयोग करें कि आवेदन C

की शुरूआत की शुरूआत। लेकिन जब मैं इसे अपने जावा प्रोग्राम A के माध्यम से चलाता हूं, C 25% CPU लोड (1 पूर्ण कोर) का उपभोग करता है। दोनों मामलों में, सीपीयू पर बैच निष्पादन शुल्क ~ 0% है।

मुझे लगता है कि जावा एप्लिकेशन के आउटपुट और त्रुटि धाराओं के कारण यह सही ढंग से संभाला नहीं जा रहा है।

क्या मैं सही हूँ? मैं इसे कैसे ठीक कर सकता हूं? उप-बच्चे (प्रक्रिया का बच्चा) प्रक्रिया स्ट्रीम प्राप्त करने का कोई तरीका है?

+0

आपका शीर्षक गलत है। उच्च लोड जावा एप्लिकेशन में है, न कि बच्चे की प्रक्रिया। –

+0

यही कारण है कि मैंने 'उप-बाल प्रक्रिया' लिखा था। – jhamon

+0

शायद आपको स्वयं को स्पष्ट रूप से समझा जाना चाहिए। वाक्यांश "उप-बाल प्रक्रिया" अर्थपूर्ण नहीं है। –

उत्तर

1

मुझे लगता है कि जावा एप्लिकेशन के आउटपुट और त्रुटि धाराओं के कारण यह सही ढंग से संभाला नहीं जा रहा है।

क्या मैं सही हूँ?

संभवतः। लेकिन यह एक बहुत ही अस्पष्ट वर्णन है जो आपको लगता है (आप सोचते हैं)।

मुझे संदेह है कि समस्या आपके StreamReader कक्षा में है।

  • यह बफरिंग के बिना धारा पढ़ने जा सकता है,
  • यह मतदान धारा हो सकता है,
  • यह हो सकता प्रसंस्करण (या जमा) एक अक्षम रास्ते में उत्पादन हो सकता है,
  • या उदाहरण के लिए: कुछ और।

यदि आप एक बेहतर उत्तर चाहते हैं, तो हमें वास्तव में उस कक्षा का कोड देखना होगा।


मुझे संदेह है कि यह System.out.println कॉल है।

या शायद यह है कि बाल जावा एप्लिकेशन बफरिंग के बिना अपना आउटपुट लिख रहा है।

+0

मेरे पास 'StreamReader' वर्ग – jhamon

+0

का कोड था, मैंने इसे हटा दिया और उचित लॉगर का उपयोग करने की कोशिश की या बस इसे छोड़ दिया। अभी भी एक ही मुद्दा मिला है – jhamon

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