2011-04-14 9 views
11

जावा दस्तावेज़ इस बिंदु पर स्पष्ट नहीं है। यदि आप एक धागा पर बाधा फोन यह कहता है Thread.sleep() पहले क्या होता है:कॉलिंग थ्रेड.sleep() * बाधित स्थिति * सेट के साथ?

 //interrupt reaches Thread here 
     try { 
      Thread.sleep(3000); 
     } catch (InterruptedException e) { 
      return; 
     } 

InterruptedException फेंक दिया जा सकता है?

कृपया प्रासंगिक दस्तावेज को इंगित करें।

उत्तर

7

हां, यह एक अपवाद फेंक देगा। Thread.sleep के लिए जावाडोक के अनुसार, विधि:

फेंकता: InterruptedException - यदि कोई धागा वर्तमान धागा बाधित कर दिया है। इस अपवाद को फेंकने पर वर्तमान धागे की बाधित स्थिति साफ़ हो जाती है।

इस मामले में 'है' बाधित स्थिति का जिक्र करने का एक अनौपचारिक तरीका है। यह एक शर्म की बात है कि यह अनौपचारिक है - यदि कहीं कहीं एक नमूना सटीक और स्पष्ट होना चाहिए, तो यह हर जगह है, लेकिन यह सब से ऊपर थ्रेडिंग प्राइमेटिव है।

तरह से बाधित स्थिति तंत्र सामान्य रूप में काम करता है, जबकि यह व्यवधान कारक नहीं है (क्योंकि यह चल रहा है), तो किसी रुकावट के अनिवार्य रूप से प्रतीक्षा करने के लिए जब तक धागा बाधित है, जिस पर यह स्वूप इंगित किया जाता है कि एक धागा एक रुकावट प्राप्त करता है एक कारण में एक interruptedException। यह उस तंत्र का एक उदाहरण है।

+1

मामूली में नहीं! –

1

InterruptedException की डॉक्स जो बताते हैं कि यह दूसरी बार

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/InterruptedException.html

फेंक दिया जब एक धागा इंतज़ार कर रहा है, सो, या अन्यथा एक लंबे समय के लिए रोक दिया और एक अन्य धागा बीच में आता है पर बाधित किया जा सकता है लगता है यह कक्षा थ्रेड

के साथ इंटरप्ट विधि का उपयोग करके, क्योंकि यह एक चेक अपवाद है, इसे केवल उन विधियों द्वारा फेंक दिया जाएगा जो इसे घोषित करते हैं। देखें

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#interrupt()

3

आप व्यवहार का परीक्षण करने के लिए निम्न वर्ग का उपयोग कर सकते हैं। इस मामले में, लूप बाधित नहीं होता है और जब नींद आती है तो थ्रेड मर जाता है।

सार्वजनिक वर्ग TestInterrupt {

public static void main(String[] args) throws InterruptedException { 
    Thread t = new Thread(){ 
     public void run(){ 
      System.out.println("hello"); 
      try { 
       for (int i = 0 ; i < 1000000; i++){ 
        System.out.print("."); 
       } 
       Thread.sleep(10000); 
      } catch (InterruptedException e) { 
       System.out.println("interrupted"); 
       e.printStackTrace(); 
      } 

     } 
    }; 
    t.start(); 
    Thread.sleep(100); 
    System.out.println("about to interrupt."); 
    t.interrupt(); 

} 

}

+0

मैंने इस कार्यक्रम की विविधता की कोशिश की और यह इंटरप्टेड एक्सेप्शन फेंक दिया, यह पुष्टि करते हुए कि बोफिन और टॉम के जवाब सही हैं। – Roland

+0

हां। यह एक अपवाद फेंकता है, लेकिन सवाल कब है? उपरोक्त मामले में, नींद को बुलाए जाने तक अपवाद नहीं फेंक दिया जाता है। – Zeki

+2

हाँ आप सही हैं। लेकिन वह पूरा बिंदु था: अगर कॉल से पहले इंटरप्ट हुआ तो अपवाद फेंक देगा? और जवाब है हाँ! – Roland

7

एक धागा समय में किसी भी बिंदु पर बाधित हो सकता है, लेकिन जब तक कि धागा विशेष रूप से Thread.currentThread().isInterrupted() के साथ अपने बाधित राज्य की जाँच करता है यह किसी भी प्रभाव नहीं होगा या जब यह तक पहुँच जाता है, या है पहले से ही एक फोन द्वारा अवरुद्ध Thread.sleep(long), Object.wait(long) या अन्य मानक JDK तरीकों जो फेंक InterruptedException ऐसे ०१२३३२५७४३१७ में उन लोगों के रूप मेंपैकेज। जब आप InterruptedException पकड़ते हैं या जब आप स्पष्ट रूप से Thread.interrupted() पर कॉल करते हैं (उस छद्म विधि के लिए दस्तावेज़ देखें) तो थ्रेड की इंटरप्ट स्थिति रीसेट हो जाती है।

This JavaSpecialists article को धागा कैसे काम करता है और उनके साथ कैसे निपटने के बारे में थोड़ा और समझा जाना चाहिए।

+1

* "जब आप इंटरप्टेड एक्सेप्शन को पकड़ते हैं तो थ्रेड की इंटरप्ट स्थिति रीसेट होती है" * - बिल्कुल नहीं। जावाडोक के मुताबिक, स्थिति को साफ़ कर दिया जाता है जब अपवाद * फेंक दिया जाता है * जब इसे पकड़ा जाता है। (और इसका मतलब है कि * पहले 'फेंक' कथन से पहले ... या इस मामले में, मूल कोड 'फेंक' के बराबर है।) –

+0

हां, यह सही है, लेकिन निश्चित रूप से आप वास्तव में जांच नहीं पाएंगे यह पकड़ा जाता है जब तक कि यह पकड़ा नहीं जाता है। मुझे लगता है कि यह कहने का लंबा तरीका है "थ्रेड की इंटरप्ट स्थिति * उस समय तक रीसेट हो जाएगी * आप एक 'इंटरप्टेड एक्सेप्शन' पकड़ते हैं" – BoffinbraiN

+0

यह उत्तर पूरी तरह से मूल प्रश्न को याद करता है, यह सुनिश्चित नहीं है कि ओपी ने इसे स्वीकार क्यों किया। सवाल यह है कि क्या 'थ्रेड.sleep()' को कॉल करना है जब बाधित फ्लैग पहले से सेट हो चुका है, परिणामस्वरूप 'इंटरप्टेड एक्सेप्शन' फेंकने की विधि होगी, और यह इसका उत्तर देने का प्रयास नहीं करता है। – haridsv

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