2012-10-31 16 views
8

मैं किसी प्रक्रिया के आउटपुट और त्रुटि स्ट्रीम से पढ़ना चाहता हूं और उन्हें टेक्स्ट की एक स्ट्रीम में विलय करना चाहता हूं। मेरे कार्यक्रम ग्रूवी में है और इस तरह पढ़ता है:थ्रेड-सुरक्षित ByteArrayOutputStream क्या है?

def mergeStream = new ByteArrayOutputStream() 
process.waitForProcessOutput(mergeStream, mergeStream) 

समस्या यह है कि ByteArrayOutputStream सुरक्षित और waitForProcessOutput थ्रेड नहीं है() दो धागे जो mergeStream को संलग्न उत्पन्न करता है। क्या कोई थ्रेड-सुरक्षित संस्करण है जिसका मैं उपयोग कर सकता हूं? आप और कैसे सलाह देते हैं कि मैं मर्जस्ट्रीम तक पहुंच नियंत्रित करता हूं? ऐसा लगता है कि अभ्यास के पात्रों को कभी-कभी इस कार्यान्वयन के साथ गिरा दिया जाता है।

+2

क्या आपने प्रोसेसबिल्डर के रीडायरेक्ट एररस्ट्रीम को माना है? – artbristol

+0

हां यह * थ्रेड सुरक्षित है, या इसके सभी तरीकों को सिंक्रनाइज़ किया गया है, और 'ProcessBuilder.redirectErrorStream()' आपका पूरा प्रश्न अनावश्यक बनाता है। असली सवाल नहीं है। – EJP

+1

@EJP - यदि आप उत्तर जानते हैं तो यह केवल "असली सवाल नहीं है" - अन्यथा, यह एक महान सवाल है! जावाडोक इसके बारे में कुछ भी नहीं सिंक्रनाइज़ किया गया है - AFAICT, आपको यह पता लगाने के लिए स्रोत में खोदना होगा, और मुझे कभी परेशान नहीं होगा (माना जाता है कि यह थ्रेडसेफ नहीं था, क्योंकि डॉक्टर ने कुछ भी नहीं कहा था) क्या आपने टिप्पणी नहीं की थी। –

उत्तर

7

process.waitForProcessOutput() तर्क के रूप में एक OutputStream लेता है, तो आप बस अपने सभी तरीकों सिंक्रनाइज़ है OutputStream के एक कस्टम कार्यान्वयन इस्तेमाल कर सकते हैं, और एक लिपटे ByteArrayOutputStream की इसी विधि प्रतिनिधि। Collections.synchronizedList() की तरह एक सिंक्रनाइज़ सूची प्रॉक्सी में दूसरी सूची लपेटती है।

संपादित करें:

जिसके अनुसार, ByteArrayOutputStream के स्रोत को पढ़ने, अपने सभी तरीकों को पहले से ही, सिंक्रनाइज़ किए जाते हैं तो यह पहले से ही धागा सुरक्षित है। आपकी बग शायद कहीं और से आती है।

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