2012-04-25 8 views
6

मैं एक निर्माता उपभोक्ता मॉडल (निर्माता धागा और जावा में उपभोक्ता धागा)अपवाद Thread.Sleep के मामले में हैंडलिंग और धागे

लिखने के लिए मैं सोच रहा था InterruptedException को संभालने के लिए कैसे कोशिश कर रहा था के मामले में इंतजार() विधि कि Thread.sleep विधि द्वारा फेंका और Object कक्षा के wait() विधि

package producerconsumer; 

import java.util.ArrayList; 

public class Consumer implements Runnable { 

    ArrayList<Integer> container; 

    @Override 
    public void run() { 
     while(true){ 
     System.out.println("Consumer Thread Running"); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     if(null==container){ 
      System.out.println("container is null"); 
     } 
     //Removing values from Arraylist 
     synchronized (container) { 
      if(container.size()==0){ 
       try { 
        container.wait(); 
       } catch (InterruptedException e) { 
        //How to tackle this exception 
        e.printStackTrace(); 
       } 
      } 
      Integer removedInteger = container.remove(container.size()-1); 
      System.out.println("removedInteger..."+removedInteger); 
     } 
     } 
    } 

    public void setContainer(ArrayList<Integer> container) { 
     this.container = container; 
    } 
} 

है, तो यह एक उदाहरण मैं ले लिया है, इस उदाहरण में इन अपवाद (मेरी धारणा) की देखभाल करने की कोई जरूरत नहीं हो सकता है।

लेकिन मैं जानना चाहता था कि अलग-अलग परिदृश्य क्या हो सकते हैं जिसमें हमें इस अपवाद को संभालने की आवश्यकता है।

+0

[जावा में हैंडलिंग इंटरप्टेड एक्सेप्शन] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3976344/handling-interruptedexception-in-java) – assylias

+0

@assylias एक अच्छा लिंक सुझाए जाने के लिए धन्यवाद। मुझे इसे देखने दो। –

उत्तर

11

मैं सोच रहा था कि कैसे बाधित अपवाद कि Thread.Sleep विधि और वस्तु वर्ग का इंतजार विधि से फेंक दिया जाता है संभाल करने के लिए

वहाँ दो महत्वपूर्ण बातें InterruptedException के बारे में महसूस करने के लिए कर रहे हैं। सबसे पहले, जब इसे Thread पर इंटरप्ट फ्लैग फेंक दिया जाता है तो उसे साफ़ कर दिया जाता है।

} catch (InterruptedException e) { 
    // re-add back in the interrupt bit 
    Thread.currentThread().interrupt(); 
    ... 
} 

यह एक बहुत महत्वपूर्ण पैटर्न क्योंकि यह अन्य कोड है कि तुम्हारा के रूप में अच्छी तरह से बाधा पता लगाने के लिए बुला रहा हो सकता है की अनुमति देता है: तो आप हमेशा की तरह कुछ करना चाहिए।

दूसरा, धागे के संदर्भ में, यदि वे बाधित हैं, तो उन्हें अधिकतर सफाई और छोड़ना चाहिए। यह निश्चित रूप से आपके लिए है, प्रोग्रामर, लेकिन सामान्य व्यवहार ऑपरेशन को समाप्त करना और छोड़ना है - अक्सर क्योंकि प्रोग्राम बंद करने की कोशिश कर रहा है।

} catch (InterruptedException e) { 
    Thread.currentThread().interrupt(); 
    // we are being interrupted so we should stop running 
    return; 
} 

अन्त में, किसी भी अपवाद हैंडलिंग के साथ, डिफ़ॉल्ट ग्रहण टेम्पलेट आमतौर पर ऐसा करने के लिए गलत बात है। कभी भी e.printStackTrace(); अपवाद नहीं। यह पता लगाएं कि आप इसके साथ क्या करना चाहते हैं: इसे एक और अपवाद के रूप में फिर से फेंक दें, इसे कहीं बेहतर लॉग करें, या थ्रेड/विधि/एप्लिकेशन से बाहर निकलें।

+0

एक और विकल्प अपवाद को फिर से फेंकना है (जिस स्थिति में आपको थ्रेड को फिर से बाधित करने की आवश्यकता नहीं है)। – yshavit

+0

@Gray इसे एक शानदार तरीके से डालने के लिए धन्यवाद। बस जानना चाहता था कि क्या हम इसे एक और अपवाद के रूप में फेंक देते हैं। क्या मेरा धागा रुक जाएगा? या लूप आगे बढ़ेगा जैसे कुछ भी नहीं हुआ है। –

+0

यह सरल जावा अर्थशास्त्र है। बिल्कुल कोई जादू नहीं है। आपकी नींद 'नींद' या 'प्रतीक्षा' करने के लिए एक अपवाद फेंक दिया। निष्पादन जारी है जैसे कि यह 'IOException' था, कहें,' इनपुटस्ट्रीम.read'। –

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