बुला करता है एक 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;
}
}
नहीं, थ्रेड.जॉइन() केवल * वर्तमान * थ्रेड में बाधाओं से संबंधित है। – EJP