2009-06-21 23 views
14

से प्रतीक्षा इनपुट पर अवरुद्ध धागे को रोकें/बाधित करें जैसे शीर्षक कहता है कि मुझे सॉकेट से इनपुट पर प्रतीक्षा किए गए थ्रेड को रोकने या बाधित करने का एक तरीका चाहिए।सॉकेट

उत्तर

8

Thread.interrupt() वह विधि होनी चाहिए जिसे आप ढूंढ रहे हैं। सुनिश्चित करें कि आपके इनपुट-एक्सेसिंग विधियों में भी इंटरप्टेड एक्सेप्शन और क्लोज़ेडइंटर इंटरप्ट अपवाद की जांच करें।

इसी तरह के page in the Sun Concurrency Tutorial पर भी देखें, जैसा कि एक अन्य समाधान से पता चलता है।

+31

, Thread.interrupt() का BufferedInputStream.read() पर कोई प्रभाव नहीं पड़ता है। –

5

सॉकेट setSoTimeout() विधि के माध्यम से टाइमआउट सेट करने की अनुमति देते हैं। उन्हें अवरुद्ध करने के लिए यह पसंदीदा तरीका है।

अन्यथा आप nio पैकेज पर एक नज़र डालना चाहते हैं जो आने वाले और आउटगोइंग डेटा को प्रबंधित करने के लिए अधिक मैन्युअल कार्य के खर्च पर गैर-अवरुद्ध I/O को अनुमति देता है।

+1

+1। मैं थ्रेड को मारने के बजाए टाइमआउट के साथ लूप के साथ चलने के साथ जाऊंगा। –

+0

एनआईओ का उपयोग करना एक साधारण रद्द ऑपरेशन के लिए बहुत जटिल हो सकता है। बीटीडब्ल्यू, "प्रोग्राम प्रवाह नियंत्रण के लिए अपवादों का उपयोग करना दुर्भाग्यवश, बहुत खराब शैली है "दुर्भाग्यवश, setSoTimeout सॉकेटटाइम एक्सेप्शन में परिणाम देगा। – akarnokd

+1

रद्दीकरण को संभालने के लिए टाइमआउट सेट करना निश्चित रूप से गलत काम है; इसका मतलब है कि रद्द करने के समय को पढ़ने के समय तक बैठना पड़ता है। –

12

आप अन्य थ्रेड से आईओ स्ट्रीम/सॉकेट को बंद कर सकते हैं। फिर, यदि आप परिणामी IOException बंद या कुछ और कारण के कारण एक अस्थिर बूलियन फ़ील्ड पर जांच कर सकते हैं। मुझे लगता है कि बंद होने के परिणामस्वरूप java.net.SocketException: Socket closed अपवाद हो सकता है।

+3

कार्यक्रम प्रवाह नियंत्रण के लिए अपवादों का उपयोग करना बहुत खराब शैली है, खासकर यदि यह सामान्य उद्देश्य वाले "आईओएक्सप्शन" है जो इस मामले में टाइमआउट के अलावा अन्य चीजों के कारण हो सकता है। –

+6

आपने मुझे गलत समझा। यदि आप सॉकेट बंद करते हैं, तो पढ़ा जाता है() एक IOException फेंकता है - इस मामले में एक सॉकेट अपवाद। IOException के लिए आपके पास पहले से ही एक प्रयास है। यदि आप Thread.interrupt() का उपयोग करते हैं तो यह भी अपवाद को फेंकने का कारण बनता है। इसलिए, आपको हमेशा कुछ अपवाद मिलता है। मैंने सुझाव दिया कि एक अपवाद फेंकने से पहले एक जानबूझकर रद्द/बंद प्रयास था, यह इंगित करने के लिए एक ध्वज जोड़ने का सुझाव दिया। – akarnokd

+2

जब आप ध्वज सेट करते हैं और 'क्लोज़() 'कॉल करते समय _true_ IOException फेंक नहीं दिया जा सकता है? –

1

sock.closeInput का उपयोग करके देखें() sock.close के बाद()

4

मैं socket.closeInput() नहीं देखा। हालांकि, मुझे socket.shutdownInput() मिला। कॉल करने के बाद (एक अलग धागे से जो स्वाभाविक रूप से पढ़ने पर अवरुद्ध था), bufferedReader.close() पर मेरी कॉल ठीक काम किया! (मैं पीछा किया

0

बंद सॉकेट और पढ़ने अनब्लॉक कर दिया जाएगा (IOException का एक उपवर्ग के साथ बाहर निकल जाएगा)। Thread.interrupt पर प्रतिक्रिया पढ़ें मंच निर्भर (Solaris पर काम नहीं करेगा है कि printWriter.close() और socket.close() के लिए कॉल के साथ। उदाहरण के लिए 10)