2012-04-07 19 views
6

क्या उपयोगकर्ता के इनपुट के लिए टाइमर सेट करना संभव है? 10 सेकंड प्रतीक्षा करें - कर अगले आपरेशन और आदि मेरा मतलब है उदाहरण के लिएउपयोगकर्ता के इनपुट के लिए समय समाप्ति

//wait several seconds{ 
String s = new BufferedReader(new InputStreamReader(System.in)).readLine(); 
//wait server seconds} 
//next operation and etc. 

उत्तर

4

नहीं शानदार तरीके से, नहीं। आम तौर पर रीडर केवल पढ़ने() कॉल से बाहर हो जाता है जब कोई अन्य थ्रेड अंतर्निहित धारा को बंद करता है, या आप इनपुट के अंत तक पहुंच जाते हैं।

चूंकि पढ़ा जाता है() सभी इंटरप्टिबल नहीं है यह एक समवर्ती प्रोग्रामिंग समस्या का थोड़ा सा बन जाता है। थ्रेड जो टाइमआउट के बारे में जानता है उसे इनपुट को पढ़ने की कोशिश कर रहे थ्रेड को बाधित करने में सक्षम होना चाहिए।

अनिवार्य रूप से, पढ़ने के धागे को पढ़ने के लिए कुछ भी नहीं होने पर पढ़ने में लॉक होने के बजाय रीडर की तैयार() विधि को मतदान करना होगा। यदि आप java.util.concurrent.Future में इस मतदान और प्रतीक्षा ऑपरेशन को लपेटते हैं, तो आप टाइमआउट के साथ भविष्य की get() विधि को कॉल करते हैं। http://www.javaspecialists.eu/archive/Issue153.html

12

एक थोड़ा आसान तरीका बेंजामिन कॉक्स जवाब से यह करने के लिए की तरह

int x = 2; // wait 2 seconds at most 

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
long startTime = System.currentTimeMillis(); 
while ((System.currentTimeMillis() - startTime) < x * 1000 
     && !in.ready()) { 
} 

if (in.ready()) { 
    System.out.println("You entered: " + in.readLine()); 
} else { 
    System.out.println("You did not enter data"); 
} 

कुछ करने के लिए यह इच्छा हो सकता है, लेकिन उनके समाधान की तुलना में अधिक संसाधनों का उपभोग:

यह लेख कुछ विस्तार में चला जाता है ।

+2

BufferedReader.ready() कोई बाइट उपलब्ध होने पर, यदि कोई नई लाइन भी उपलब्ध नहीं है, तो यह सच साबित होता है। उस मामले पर विचार करें जहां एक चरित्र पीछे की नई लाइन के बिना इंतजार कर रहा है। in.ready() सत्य देता है, in.readLine() को कॉल किया जाता है, लेकिन अनिश्चित काल तक नई लाइन के लिए इंतजार कर रहा है। – pendor

+1

@ विक्रेता लेकिन मानक 'System.in' केवल तभी डेटा होगा जब उपयोगकर्ता कमांड लाइन पर प्रवेश करता है जो न्यूलाइन अनुक्रम प्रदान करता है। – Jeffrey

+1

@ जेफरी कहीं भी दस्तावेज है? – Max

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