2013-11-01 5 views
10

मेरे पास थोड़ी देर लूप है और मैं कुछ समय बीतने के बाद बाहर निकलना चाहता हूं।एक निश्चित समय के बाद थोड़ी देर के लिए कैसे बाहर निकलें?

उदाहरण के लिए:

while(condition and 10 sec has not passed){ 

} 
+3

मेरा अनुमान से, क्या आप देख रहे हैं यह है: http://stackoverflow.com/questions/4252187/ कैसे-टू-स्टॉप-निष्पादन-बाद-निश्चित-समय-में-जावा # उत्तर -4252197 – sPaz

उत्तर

22
long startTime = System.currentTimeMillis(); //fetch starting time 
while(false||(System.currentTimeMillis()-startTime)<10000) 
{ 
    // do something 
} 

इस प्रकार बयान

(System.currentTimeMillis()-startTime)<10000 

जांच करें कि क्या यह 10 सेकंड या 10,000 मिलीसेकंड कर दिया गया है के बाद से पाश शुरू कर दिया।

संपादित

@Julien के रूप में कहे अनुसार, इस विफल हो सकता है, जबकि पाश के अंदर अपना कोड ब्लॉक ExecutorService का उपयोग कर एक अच्छा विकल्प होगा time.Thus का एक बहुत लगता है।

पहले हम

ExecutorService executor = Executors.newSingleThreadExecutor(); 
executor.invokeAll(Arrays.asList(new MyTask()), 10, TimeUnit.SECONDS); // Timeout of 10 seconds. 
executor.shutdown(); 
+1

जैसा कि मेरे उत्तर में बताया गया है, यह कोड चाल नहीं करेगा। यदि लूप में कोड अनंत समय लेता है तो यह अनिश्चित रूप से चला सकता है। – Julien

+0

धन्यवाद, कृपया संपादन देखें। –

7

कुछ की तरह:

long start_time = System.currentTimeMillis(); 
long wait_time = 10000; 
long end_time = start_time + wait_time; 

while (System.currentTimeMillis() < end_time) { 
    //.. 
} 

चाल करना चाहिए। यदि आपको अन्य स्थितियों की भी आवश्यकता है तो बस उन्हें थोड़ी देर के वक्त में जोड़ें।

10

प्रस्तावित और स्वीकार किए जाते हैं समाधान चाल से काम नहीं चलेगा Runnable

class MyTask implements Runnable 
{ 
    public void run() { 
     // add your code here 
    } 
} 

तो हम इस तरह ExecutorService उपयोग कर सकते हैं लागू करने के लिए है, होगा।

यह 10 सेकंड के बाद लूप को नहीं रोकेगा। कल्पना करें कि आपके लूप में कोड को संसाधित करने में 20 सेकंड लगते हैं और 9.9 सेकेंड पर कॉल किया जाता है। आपका कोड निष्पादन के 29.9 सेकंड के बाद बाहर निकल जाएगा।

यदि आप 10 सेकंड के बाद बिल्कुल रुकना चाहते हैं, तो आपको एक बाहरी थ्रेड में अपना कोड निष्पादित करना होगा जिसे आप एक निश्चित टाइमआउट के बाद मार देंगे।

मौजूदा समाधान पहले से ही here और there

0

प्रस्तावित किया गया है इस

System.currentTimeMillis()-startTime 

का उपयोग न करें यह होस्ट मशीन समय परिवर्तन पर लटका हो सकती है। बेहतर उपयोग इस तरह से:

Integer i = 0; 
      try { 
       while (condition && i++ < 100) { 
        Thread.sleep(100); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

(100 * 100 = 10 सेकंड का समय समाप्त)

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