जावा का थ्रेड। स्लीप इंटरप्टेड एक्ससेप्शन कब फेंकता है?


110

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



1
निर्भर करता है कि आप किस अर्थ में "उपेक्षा" करते हैं। InterruptedExceptionएक पकड़ा हुआ अपवाद है, इसलिए आप तब तक संकलन नहीं कर सकते जब तक कि आप किसी भी विधि पर इस प्रकार के अपवाद को नहीं संभालते या घोषित नहीं करते हैं, जो जुड़ता है या सोता है Thread, या कॉल wait()करता है Object
8bitjunkie

जवाबों:


41

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

हस्तक्षेप न करें

कभी-कभी InterruptedException को फेंकना एक विकल्प नहीं है, जैसे कि जब Runnable द्वारा परिभाषित कोई कार्य एक रुकावट विधि कहता है। इस मामले में, आप InterruptedException को पुनर्व्यवस्थित नहीं कर सकते, लेकिन आप कुछ भी नहीं करना चाहते हैं। जब एक अवरोधन विधि रुकावट का पता लगाती है और InterruptedException को फेंकती है, तो यह बाधित स्थिति को साफ करता है। यदि आप InterruptedException को पकड़ते हैं, लेकिन उसे वापस नहीं ला सकते हैं, तो आपको सबूतों को संरक्षित करना चाहिए कि व्यवधान उत्पन्न हुआ है, ताकि कॉल स्टैक पर उच्चतर कोड रुकावट के बारे में जान सके और यदि वह चाहे तो उस पर प्रतिक्रिया दे सके। इस कार्य को वर्तमान थ्रेड को "रीइंटररनेट" करने के लिए रुकावट () ​​को कॉल करके पूरा किया जाता है, जैसा कि लिस्टिंग 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-


38

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

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

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

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

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

} catch (InterruptedException e) {
  throw new RuntimeException("Unexpected interrupt", e);
}

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


5
जावा में दावे डिफ़ॉल्ट रूप से बंद हैं । इसलिए बेहतर होगा कि आप सिर्फ फेंक दें RuntimeException
इवगेनी सर्गेव

11

जावा विशेषज्ञ समाचार पत्र (जिसे मैं अनारक्षित रूप से सुझा सकता हूं) इस पर एक दिलचस्प लेख था , और कैसे संभालना था InterruptedException। यह पढ़ने और पचाने लायक है।


1
यह क्या कहता है?
Theonlygusti

5

कक्षा की तरह sleep()और तरीके ए फेंक सकते हैं । यह तब होगा जब कोई अन्य व्यक्ति इंतजार या नींद पूरी करना चाहता था ।wait()ThreadInterruptedExceptionthreadthread


3

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


-7

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


13
यह गलत है, क्योंकि यह नींद ही नहीं है जो कि बीच में है, बल्कि थ्रेड इसे चला रहा है। बाधित एक थ्रेड अवस्था है। यह सिर्फ नींद की विधि से बाहर निकलता है।
ubuntudroid
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.