2011-11-08 34 views
5

मैं एक धागा बाधित करने के लिए चाहते हैं, लेकिन बाधा आह्वान() काम नहीं लगता है, नीचे दिए गए नमूना कोड है:क्यों बाधा() अपेक्षा के अनुरूप काम नहीं और यह कैसे काम करता

public class BasicThreadrRunner { 
    public static void main(String[] args) { 
     Thread t1 = new Thread(new Basic(), "thread1"); 
     t1.start(); 
     Thread t3 = new Thread(new Basic(), "thread3"); 
     Thread t4 = new Thread(new Basic(), "thread4"); 
     t3.start(); 
     t1.interrupt(); 
     t4.start(); 
    } 
} 
class Basic implements Runnable{ 
    public void run(){ 
     while(true) { 
      System.out.println(Thread.currentThread().getName()); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       System.err.println("thread: " + Thread.currentThread().getName()); 
       //e.printStackTrace(); 
      } 
     } 
    } 
} 

लेकिन उत्पादन की तरह दिखता है thead1 अभी भी चल रहा है। तो क्या कोई इसे समझा सकता है, कैसे इंटरप्ट() काम करता है, धन्यवाद

उत्तर

12

थ्रेड अभी भी चल रहा है क्योंकि आप InterruptedException पकड़ते हैं और चलते रहते हैं। interrupt() मुख्य रूप से Thread ऑब्जेक्ट में एक ध्वज सेट करता है, जिसे आप isInterrupted() से देख सकते हैं। यह कुछ तरीकों का कारण बनता है - sleep(), joinObject.wait(), विशेष रूप से - InterruptedException फेंककर तुरंत लौटने के लिए। यह कुछ I/O संचालन को तुरंत समाप्त करने का कारण बनता है। यदि आप अपने catch ब्लॉक से प्रिंटआउट देख रहे हैं, तो आप देख सकते हैं कि interrupt() काम कर रहा है।

+0

: आपकी मदद – jason

10

जैसा कि अन्य ने कहा है, आप बाधा पकड़ते हैं, लेकिन इसके साथ कुछ भी नहीं करते हैं। आपको क्या करने की जरूरत है प्रचार बाधा जैसे,

while(!Thread.currentThread().isInterrupted()){ 
    try{ 
     // do stuff 
    }catch(InterruptedException e){ 
     Thread.currentThread().interrupt(); // propagate interrupt 
    } 
} 

तर्क का प्रयोग, पाशन तर्क का उपयोग इस तरह के रूप while(true) सिर्फ आलसी कोडिंग है। इसके बजाए, रुकावट के माध्यम से समाप्ति निर्धारित करने के लिए थ्रेड के बाधित ध्वज को मतदान करें।

+0

के लिए धन्यवाद या आप लूप के बाहर प्रयास/पकड़ को स्थानांतरित कर सकते हैं। ;) –

+2

हां, लेकिन पहले से ही @MByD द्वारा इसका उल्लेख किया गया था और यह उस खराब लूपिंग तर्क को बरकरार रखता है। : डी – mre

+0

@mre: while (true) पी.एस. के वैकल्पिक दृष्टिकोण का उल्लेख करने के लिए आपके anwser – jason