ProcessBuilder पैदा की प्रक्रिया के लिए एक लॉक कर रहा है

वोट
0

मैं अपने कार्यक्रम से एक बाहरी जावा प्रक्रिया लागू कर रहा हूँ। मैं इस तरह है कि पैदा की प्रक्रिया द्वारा उत्पन्न उत्पादन लेने वाली हूँ:

DataInputStream dis = new DataInputStream(new BufferedInputStream(myProcess.getInputStream()));

एक धागे से मैं निम्नलिखित कर रहा हूँ:

            while (dis.available() != 0) 
            {                   

                firstMesg = dis.readLine();


                if(firstMesg != null) 
                {
                    // processing with the message
                    //System.out.println(firstMesg);    
                }                                                                       
            } 


            try 
            {
                Thread.currentThread().sleep(SLEEP_TIME);
            }
            catch(Throwable e) 
            {
            }

मैं 1 मिनट के आसपास SLEEP_TIME दे रहा था और सब कुछ ठीक काम कर रहा था। अचानक एक विशेष सेटअप के लिए मैं पाया है Sys बाहर (System.out.println) पैदा की प्रक्रिया से awefully समय लग रहा है।

किसी को भी मेरे लिए इंगित कर सकते हैं क्या हुआ? इन दोनों प्रक्रियाओं स्वतंत्र होना चाहिए। हालांकि invoker लागू प्रक्रिया से पढ़ कर रहा है। लेकिन बफर बड़े जहां लागू प्रक्रिया लिख ​​रहा है होना चाहिए। तो वहाँ कोई रास्ता नहीं यह अवरुद्ध किया जाना चाहिए है।

मैं ProcessBuilder जावा दस्तावेज़ में देख सकते हैं:

माता-पिता की प्रक्रिया इन धाराओं का उपयोग करता है (#getInputStream (), #getErrorStream ()) के लिए इनपुट फ़ीड और उपप्रक्रिया से उत्पादन प्राप्त करने के लिए। क्योंकि कुछ स्थानीय प्लेटफ़ॉर्म केवल मानक इनपुट और आउटपुट धाराओं के लिए सीमित बफर आकार प्रदान करते हैं, तुरंत इनपुट धारा लिखने या उपप्रक्रिया के उत्पादन धारा को पढ़ने के लिए विफलता उपप्रक्रिया ब्लॉक करने के लिए कारण हो सकता है, और यहां तक ​​गतिरोध।

30/10/2013 को 09:03
उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
0

आप की जरूरत है लगातार पढ़ते हैं, बजाय पढ़ा क्या तुरंत उपलब्ध है और फिर सोते हैं। नोट (भी) है कि आप दोनों के लिए एक ही करना चाहिए stdout और stderr

देखें इस सवाल का एक प्रयोग पर जानकारी के लिए StreamGobblerइस लक्ष्य को हासिल करने के लिए।

30/10/2013 को 09:08
का स्रोत उपयोगकर्ता

वोट
0

यह व्यवहार मैं अपने मामले में उम्मीद करेंगे है। तो एक प्रक्रिया का उत्पादन stdout(या उस बात के लिए stderr) उत्पादन यह कुछ वास्तव में उस उत्पादन के साथ कुछ कर रही बिना हमेशा के लिए ऐसा करना जारी रखने नहीं कर सकता। के रूप में अपनी प्रक्रिया उत्पादन का उत्पादन यह ऑपरेटिंग सिस्टम द्वारा बफ़र हो जाएगी जब तक कि बफर पूर्ण हो जाता है। आपका प्रक्रिया बफर और अधिक स्थान फिर से बनाने से पढ़ता है। यदि आपके कार्यक्रम कुछ बिंदु पर तो नहीं पढ़ता बफर भर जाएगा, और ऑपरेटिंग सिस्टम की प्रक्रिया को निलंबित कर देगा जब तक स्थान उपलब्ध आता है।

अपने जावा प्रक्रिया STDOUT पढ़ने के लिए में एक धागा बनाएँ, और जावा पक्ष में इसे बफ़र अगर आप की जरूरत है। दूसरी ओर, आप शायद इसे संसाधित के रूप में यह बस आता है क्योंकि ऐसा लगता है यह बहुत है की तरह करना चाहिए।

संपादित करें: टिप्पणी के आधार पर ... और अन्य बातों के ....

DataInputStream.readLine () हटाई गई है, उसका उपयोग नहीं करते।

इसके बजाय थोड़ी देर के पाश करता होने के:

while (dis.available() != 0) {...}

कर

while ((line = br.readLine()) != null) { ....}

जहां brएक हैnew BufferedReader(new InputStreamReader(myProcess.getInputStream()))

30/10/2013 को 09:09
का स्रोत उपयोगकर्ता

वोट
1

पर एक नजर डालें NuProcess पुस्तकालय, यह गैर अवरुद्ध (एसिंक्रोनस) आई / ओ पैदा की प्रक्रियाओं के लिए प्रदान करता है। अस्वीकरण: मैं NuProcess के लेखक हूँ

20/11/2013 को 01:30
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more