स्यूडोकोड में, यहाँ मैं क्या कर रहा है:Process.waitFor(), धागे, और InputStreams
Process proc = runtime.exec(command);
processOutputStreamInThread(proc.getInputStream());
processOutputStreamInThread(proc.getErrorStream());
proc.waitFor()
लेकिन, कभी कभी processOutputStreamInThread
नहीं किसी भी उत्पादन देखता और कभी कभी यह नहीं करता है। असल में, विधि कमांड के आउटपुट के BufferedInputStream
बनाता है और इसे लॉगर में भेजता है।
मैं क्या दिखाई दे रही है के आधार पर, मेरा अनुमान है कि कि command
सब यह धाराओं getInputStream()
और getErrorStream()
से तंग आ गया में फेंक दिया उत्पादन है की आवश्यकता नहीं है, इस प्रकार धारा खाली हो करने की इजाजत दी।
मेरी परीक्षणों के परिणाम निम्नलिखित प्रश्न हैं:
(1)java.lang.Process में waitFor()
निष्पादित कार्यक्रम के उत्पादन से पहले ही रिटर्न को पढ़ लेने की आवश्यकता होती है किया गया है?
प्रलेखन केवल राज्यों:
यदि आवश्यक हो तो प्रतीक्षा करने के लिए, जब तक प्रक्रिया इस
Process
वस्तु का प्रतिनिधित्व करती समाप्त कर दिया है वर्तमान धागा कारण बनता है। यदि उपप्रोसेस पहले ही समाप्त हो चुका है तो यह विधि तत्काल लौटती है। यदि उपप्रोसेस अभी तक समाप्त नहीं हुआ है, तब तक कॉलिंग थ्रेड अवरुद्ध हो जाएगा जब तक उपप्रोसेस निकलता नहीं है।
(2) किन स्थितियों getInputStream
और getErrorStream
द्वारा प्रदान की धाराओं के तहत कर बंद किया जा करने की जरूरत है और/या वे अपने आप बंद कर रहे हैं?
प्रलेखन केवल राज्यों:
उपप्रक्रिया की त्रुटि धारा हो जाता है। धारा इस प्रक्रिया ऑब्जेक्ट द्वारा प्रस्तुत प्रक्रिया की त्रुटि आउटपुट स्ट्रीम से पाइप डेटा प्राप्त करती है।
कार्यान्वयन नोट: इनपुट स्ट्रीम को बफर करने के लिए यह एक अच्छा विचार है।
एक user reports कि वह स्वयं धाराओं बंद करने के लिए किया था, लेकिन मैं एक अपवाद समय का संकेत है कि धारा पहले से ही बंद कर दिया है जब मैं ऐसा करने का प्रयास के कम से कम हिस्सा मिलता है।
संपादित करें:getOutputStream
से getInputStream
बदल गया, जो अब ऊपर मौजूद है।
समाधान: समस्या जा रहा है कुछ मामलों में धागे उत्पादन स्ट्रीम प्रोसेस होने, जब तक के बाद मेरे बहुत अल्पकालिक प्रक्रिया पूरी हो चुकी है नहीं चला होगा मुझे कोई डेटा देने के इनपुट स्ट्रीम में जिसके परिणामस्वरूप इस्तेमाल किया है कि समाप्त हो गया। waitFor
निष्पादित कार्यक्रम के आउटपुट के लिए कोई इंतजार नहीं किया। इसके बजाय, प्रोग्राम किसी भी आउटपुट को इकट्ठा करने से पहले भाग गया और समाप्त हो गया।
मैंने धागे का उपयोग किया क्योंकि मुझे यकीन नहीं है कि मैं मानक त्रुटि और मानक आउटपुट पर कितना आउटपुट प्राप्त करने जा रहा था और मैं एक साथ अवरुद्ध किए बिना, दोनों को एक साथ संसाधित करने में सक्षम होना चाहता था, दूसरे में से केवल एक होना चाहिए मौजूद डेटा। लेकिन, क्योंकि मेरे धागे निष्पादित प्रोग्राम के आउटपुट को लगातार पढ़ नहीं सकते हैं, यह एक गैर-समाधान है।
मेरे अंतिम कोडित कुछ इस तरह देखा:
ProcessBuilder pb = new ProcessBuilder(cmdargs);
pb.redirectErrorStream(true);
Process proc = pb.start();
processOutputStream(proc.getInputStream());
proc.waitFor()
यदि अन्यथा उपयोग किया जाता है तो अन्य धाराएं भी बंद होनी चाहिए? प्रक्रिया समाप्त होने पर वे पूरी तरह बंद हो जाते हैं? –
@ Kaleb मैंने आपके प्रश्न का उत्तर आपके पोस्ट में जोड़ा है। –
जावावर्ल्ड आलेख के बारे में, अंतिम समाधान के साथ एक बग है। यदि कोई प्रक्रिया बहुत जल्दी समाप्त हो जाती है, तो त्रुटि Gobbler और outputGobbler ने अभी तक डेटा चलाया और उपभोग नहीं किया हो सकता है। कोड होना चाहिए: proc.waitFor(); errorGobbler.join(); outputGobbler.join() ;. इसने मुख्य धागे को तब तक प्रतीक्षा करने के लिए मजबूर कर दिया जब तक कि धाराएं इनपुट पढ़ने को समाप्त न करें। –