80

जावा के थ्रेड.sleep फेंक इंटरप्टेड एक्सेप्शन कब होता है? क्या इसे अनदेखा करना सुरक्षित है? मैं कोई मल्टीथ्रेडिंग नहीं कर रहा हूं। मैं बस कुछ ऑपरेशन पुनः प्रयास करने से पहले कुछ सेकंड इंतजार करना चाहता हूं।जावा के थ्रेड.sleep फेंक इंटरप्टेड एक्सेप्शन कब होता है?

+2

http://stackoverflow.com/questions/1024651/do-i-have-to-worry-about-interruptedexceptions-if-i-dont-interrupt-anything-myse –

+1

किस अर्थ में आपका मतलब है "अनदेखा करें" । 'InterruptedException' एक पकड़ा अपवाद है, इसलिए जब तक आप' थ्रेड 'में शामिल या सोते हैं, या' ऑब्जेक्ट 'पर' प्रतीक्षा() 'कॉल करते हैं, तो आप इस प्रकार के अपवाद को किसी भी विधि पर संभाल या घोषित नहीं कर सकते हैं। – 8bitjunkie

+1

यह आलेख आपको इस तंत्र को समझने में मदद कर सकता है: [आप इंटरप्टेड एक्सेप्शन के साथ क्या करते हैं?] (Http://www.yegor256.com/2015/10/20/interrupted-exception.html) – yegor256

उत्तर

24

आप आम तौर पर नहीं अपवाद अनदेखा कर देना चाहिए। निम्नलिखित कागज पर एक नज़र डालें:

बीच में आता है

निगल न करें कभी कभी फेंक InterruptedException जैसे जब कोई कार्य Runnable द्वारा परिभाषित एक व्यवधान कारक प्रणाली को बुलाती है के रूप में एक विकल्प नहीं है, है। इस मामले में, आप इंटरप्टेड अपवाद को पुनर्स्थापित नहीं कर सकते हैं, लेकिन आप कुछ भी नहीं करना चाहते हैं। एक अवरुद्ध विधि रुकावट का पता लगाता है और InterruptedException फेंकता है, यह बाधित स्थिति साफ करता है। आप InterruptedException पकड़ने लेकिन यह rethrow नहीं कर सकते हैं, तो आप सबूत है कि रुकावट कॉल स्टैक पर इतना है कि कोड उच्च ऊपर हुआ रुकावट के जानने के लिए और यह करने के लिए जवाब है, तो यह करना चाहता है कर सकते हैं बनाए रखने चाहिए। यह कार्य को वर्तमान धागे को "रीइंटरटर" करने के लिए इंटरप्ट() को "पुन: दर्ज" करने के लिए पूरा किया जाता है, जैसा कि लिस्टिंग 3 में दिखाया गया है। कम से कम, जब भी आप इंटरप्ट किए गए अपवाद को पकड़ते हैं और इसे फिर से नहीं हटाते हैं, तो लौटने से पहले वर्तमान धागे को दोबारा शुरू करें।

public class TaskRunner implements Runnable { 
    private BlockingQueue<Task> queue; 

    public TaskRunner(BlockingQueue<Task> queue) { 
     this.queue = queue; 
    } 

    public void run() { 
     try { 
      while (true) { 
       Task task = queue.take(10, TimeUnit.SECONDS); 
       task.execute(); 
      } 
     } 
     catch (InterruptedException e) { 
      // Restore the interrupted status 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 

यहाँ पूरे कागज देखें:

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-

+0

पृष्ठ नहीं मिला है। क्या आप अपनी पोस्ट अपडेट कर सकते हैं? – Laurence

+1

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs- –

4

एकल थ्रेडेड कोड में इसे संभाल करने के लिए एक ठोस और आसान तरीका होगा ख ई इसे पकड़ने के लिए और इसे प्रत्येक विधि के लिए घोषित करने की आवश्यकता से बचने के लिए, RuntimeException में इसे फिर से निकालें।

9

जावा विशेषज्ञ न्यूजलेटर (जिसे मैं अनारक्षित रूप से अनुशंसा कर सकता हूं) में interesting article on this था, और InterruptedException को कैसे संभालना है। यह पढ़ने और पचाने लायक है।

-4

InterruptedException आमतौर पर फेंक दिया जब एक नींद में बाधा आती है है।

+11

यह गलत है, क्योंकि यह नींद नहीं है जो हस्तक्षेप है, लेकिन थ्रेड इसे चला रहा है। बाधित एक थ्रेड राज्य है। यह सिर्फ बाहर निकलने वाली नींद विधि की ओर जाता है। – ubuntudroid

23

एक InterruptedException फेंक दिया जाता है, तो इसका मतलब है कि कुछ बाधित करने के लिए (आमतौर पर समाप्त) कि थ्रेड चाहता है। यह थ्रेड इंटरप्ट() विधि को कॉल द्वारा ट्रिगर किया जाता है। प्रतीक्षा विधि उसको पता लगाती है और एक इंटरप्टेड एक्सेप्शन फेंकता है ताकि पकड़ कोड तुरंत समाप्त करने के अनुरोध को संभाल सके और निर्दिष्ट समय तक प्रतीक्षा न हो।

आप एक एकल थ्रेड एप्लिकेशन (और भी कुछ मल्टी-थ्रेडेड क्षुधा में) में इसका इस्तेमाल करते हैं, तो उस अपवाद शुरू किया जा कभी नहीं होगा। एक खाली पकड़ खंड होने से इसे अनदेखा करते हुए मैं अनुशंसा नहीं करता। InterruptedException की फेंकने थ्रेड की बाधित स्थिति को साफ़ करती है, इसलिए अगर सही तरीके से संभाला नहीं जाता है तो जानकारी खो जाती है। इसलिए मैं दौड़ने का प्रस्ताव दूंगा:

} catch (InterruptedException e) { 
    Thread.currentThread().interrupt(); 
    // code for stopping current task so thread stops 
} 

जो फिर से राज्य को सेट करता है। उसके बाद, निष्पादन खत्म करें।यह सही व्यवहार होगा, यहां तक ​​कि कभी भी कठिन नहीं होता।

क्या बेहतर हो सकता है एक जोड़ने के लिए है: कैच ब्लॉक करने के लिए

} catch (InterruptedException e) { 
    assert false; 
} 

बयान। इसका मूल रूप से मतलब है कि यह कभी नहीं होना चाहिए। इसलिए यदि किसी ऐसे वातावरण में कोड का पुन: उपयोग किया जाता है जहां यह हो सकता है तो यह इसके बारे में शिकायत करेगा।

+4

जावा में दावा [डिफ़ॉल्ट रूप से बंद हैं] (http://stackoverflow.com/a/2758645/1143274)। तो बस 'रनटाइम अपवाद' फेंकना बेहतर है। –

0

तरीके sleep() और वर्ग Thread की wait() की तरह एक InterruptedException फेंक सकता है। ऐसा तब होगा जब कुछ अन्य threadthread जो प्रतीक्षा या सो रहे हैं को बाधित करना चाहते हैं।

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