11

असल में, सवाल शीर्षक क्या कहता है।थ्रेड.जॉइन() से पहले Thread.interrupt() को कॉल करने से पहले() को इंटरप्टेड एक्सेप्शन फेंकने का कारण बनता है?

Thread t = new Thread(someRunnable); 
t.start(); 
t.interrupt(); 
t.join(); //does an InterruptedException get thrown immediately here? 

मेरे अपने परीक्षणों से, ऐसा लगता है, लेकिन बस यह सुनिश्चित करना चाहता था। मुझे लगता है कि Thread.join() अपने "प्रतीक्षा" दिनचर्या करने से पहले धागे की interrupted स्थिति की जांच कर रहा है?

+2

नहीं, थ्रेड.जॉइन() केवल * वर्तमान * थ्रेड में बाधाओं से संबंधित है। – EJP

उत्तर

14

interrupt() आपके द्वारा बाधित थ्रेड को बाधित करता है, न कि थ्रेड को बाधित करता है।

सी.एफ.

Thread.currentThread().interrupt(); 
t.join(); // will throw InterruptedException 
14

बुला करता है एक Thread.join से पहले Thread.interrupt()() में शामिल होने के() एक InterruptedException तुरंत फेंक करने के लिए कारण?

नहीं, यह फेंक नहीं देगा। केवल वर्तमान थ्रेड जो join() विधि को कॉल कर रहा है, join()InterruptedException फेंक देगा। t.interrupt() आपके द्वारा अभी शुरू किए गए थ्रेड को बाधित कर रहा है, जबकि t.join() केवल InterruptedException फेंक देगा यदि थ्रेड जो शामिल हो रहा है (शायद मुख्य धागा?) स्वयं बाधित है।

Thread t = new Thread(someRunnable); 
t.start(); 
t.interrupt(); 
t.join(); // will _not_ throw unless this thread calling join gets interrupted 

इसके अलावा यह महसूस करने के लिए एक धागा दखल यह औरjoin() में है कि यह अपवाद धागा फेंक दिया वापस आ जाएगी एक Future जैसा नहीं है रद्द नहीं करता है कि महत्वपूर्ण है।

जब आप एक धागा बाधा डालते हैं, किसी भी कॉल धागा sleep(), wait(), join() लिए कर रहा है, और अन्य व्यवधान कारक तरीकों InterruptedException फेंक देते हैं। यदि उन विधियों को नहीं कहा जाता है तो थ्रेड चलना जारी रहेगा। यदि कोई थ्रेड बाधित होने के जवाब में InterruptedException फेंक देता है और फिर छोड़ देता है, तब तक यह अपवाद तब तक खो जाएगा जब तक आप t.setDefaultUncaughtExceptionHandler(handler) का उपयोग नहीं करते।

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

public void run() { 
    try { 
     Thread.sleep(10000); 
    } catch (InterruptedException e) { 
     // a good pattern is to re-interrupt the thread when you catch 
     Thread.currentThread().interrupt(); 
     // another good pattern is to make sure that if you _are_ interrupted, 
     // that you stop the thread 
     return; 
    } 
}