मैं एक बहु थ्रेडेड वातावरण का उपयोग कर रहा हूं, एक थ्रेड बार-बार scanner.nextLine()
पर कॉल करके उपयोगकर्ता इनपुट के लिए सुन रहा है। एप्लिकेशन को समाप्त करने के लिए, यह रनलोप किसी अन्य थ्रेड द्वारा रुक गया है, लेकिन सुनने वाला धागा तब तक नहीं रुक जाएगा जब तक कि अंतिम उपयोगकर्ता इनपुट नहीं किया गया था (nextLine()
की अवरुद्ध प्रकृति के कारण)।java.util.Scanner को कैसे बाधित करें अगलीलाइन कॉल
स्ट्रीम बंद करना एक विकल्प नहीं है क्योंकि मैं System.in से पढ़ रहा हूं, जो InputStream
लौटाता है जो बंद नहीं है।
क्या स्कैनर को अवरुद्ध करने में कोई रास्ता है, ताकि वह वापस आए?
धन्यवाद
आप 'scanner.nextLine()' के बजाय 'scanner.hasNext()' को कॉल कर सकते हैं, यह विधि ** ** ** javadoc के अनुसार ब्लॉक कर सकता है, इसलिए, आपको इसे संभालने की आवश्यकता हो सकती है। विचार यह है कि 'scanner.nextLine() ',' scanner.hasNext() 'इनपुट को अग्रिम नहीं करता है, इसलिए यदि आप scanner.nextLine को कॉल करने से पहले रीडिंग थ्रेड को किसी अन्य थ्रेड द्वारा रोक दिया गया है तो आप ध्वज की जांच कर सकते हैं () ' –
हां, लेकिन इसमें निरंतर मतदान शामिल होगा। –
आपको सुनने वाले धागे पर Thread.interrupt को कॉल करने में सक्षम होना चाहिए, इससे ioException() विधि से आप एक इंटरप्टेडियोएक्सप्शन प्राप्त कर सकते हैं। यह सुनिश्चित नहीं है कि यह अगलीलाइन() के साथ कैसे इंटरैक्ट करता है या यदि यह आपके अंतर्निहित इनपुटस्ट्रीम के साथ काम करता है, लेकिन इसे अधिकांश मामलों में अगली पंक्ति समाप्त करनी चाहिए। – josefx