multithreading - Write end dead exception using PipedInputStream java -


निम्नलिखित स्थिति में अंतिम अपवाद लिखें: दो थ्रेड:

  ए: PipedOutputStream Put = new PipedOutputStream (); स्ट्रिंग msg = "MESSAGE"; output.wirte (msg.getBytes ()); output.flush (); बी: पाइप इनटस्टस्ट्रीम प्राप्त करें = नया पाइप ऑउटपुटस्ट्रीम (एपुट); बाइट [] get_msg = नया बाइट [1024]; get.read (get_msg);   

यहाँ स्थिति है: ए और बी समवर्ती रूप से चलाते हैं, और ए पाइप को लिखता है और बी इसे पढ़ता है। बी सिर्फ इस पाइप के पाइप और बफर से पढ़ा है साफ है। फिर ए अज्ञात अंतराल में पाइप को संदेश नहीं लिखता है। हालांकि, एक पल में, बी पाइप फिर से पढ़ता है और java.io.IOException: लिखना समाप्त हुआ होता है, क्योंकि पाइप का बफर अभी भी खाली है और मैं सोना नहीं चाहता () थ्रेड बी को पाइप लिखने के लिए इंतजार करना, जो भी अस्थिर है। इस समस्या से कैसे बचें और इसे हल करें? धन्यवाद

"अंत में लिखें" अपवाद उत्पन्न होंगे जब आपके पास होगा:

    < Li> एक पाइप इनटस्टस्ट्रीम एक पाइप ऑउटपुटस्ट्रीम से जुड़ा हुआ है और
  • इन पाइपों की छोर दो अलग-अलग थ्रेडों द्वारा पढ़ / लिखी गई है
  • धागे पाइप के अपने पक्ष को बंद किए बिना समाप्त होते हैं।

    इस अपवाद को हल करने के लिए, अपने पाईड स्ट्रीम को अपने थ्रेड के रननेबल में बंद करें, जब आप पाइप स्ट्रीम से / लिखने और पढ़ने के बाइट्स को पूरा कर लें।

    यहां कुछ नमूना कोड है: <पूर्व> अंतिम पाइप आउटपुट स्ट्रीम आउटपुट = नया पाइप ऑउटपुटस्ट्रीम (); अंतिम पाइप इनटस्टस्ट्रीम इनपुट = नया पाइपइनपुटस्ट्रीम (आउटपुट); थ्रेड धागा 1 = नया थ्रेड (नया रननाबल) {@ ओवरराइड पब्लिक वायड रन () {try.write ("हैलो पिपेड स्ट्रीम्स !! इंटर थ्रेड कम्यूनिकेशन के लिए इस्तेमाल किया गया है" .getBytes ()); आउटपुट.क्लोस ();} पकड़ (IOException io) {io.printStackTrace ();}}}); थ्रेड थ्रेड 2 = नया थ्रेड (नया रननाबल) {@ ओवरराइड पब्लिक व्हॉइड रन () {{डेटा को आज़माएं}, जबकि ((डेटा = इनपुट.read ())! = -1) {System.out.println (डेटा + " === & gt; "+ (चार) डेटा);} इनपुट.क्लोस ();} पकड़ (IOException io) {io.printStackTrace ();}}}); thread1.start (); thread2.start ();

    पूरा कोड यहाँ है:

    अधिक जानकारी के लिए, कृपया इस अच्छे ब्लॉग को देखें:

Comments