क्या आप बता सकते हैं कि क्या java.lang.Thread.interrupt()
किया जाता है?
क्या आप बता सकते हैं कि क्या java.lang.Thread.interrupt()
किया जाता है?
जवाबों:
Thread.interrupt()
लक्ष्य धागे की बाधित स्थिति / ध्वज सेट करता है। फिर उस लक्ष्य थ्रेड में चल रहा कोड MAY बाधित स्थिति को प्रदूषित करता है और इसे उचित रूप से संभालता है। ब्लॉक करने वाले कुछ तरीके Object.wait()
तुरंत बाधित स्थिति का उपभोग कर सकते हैं और एक उपयुक्त अपवाद फेंक सकते हैं (आमतौर पर InterruptedException
)
जावा में व्यवधान पूर्व-खाली नहीं है। एक और तरीका है कि दोनों थ्रेड्स को व्यवधान को ठीक से संसाधित करने के लिए सहयोग करना है। यदि लक्ष्य धागा बाधित स्थिति को प्रदूषित नहीं करता है तो व्यवधान को प्रभावी ढंग से अनदेखा किया जाता है।
मतदान उस Thread.interrupted()
विधि के माध्यम से होता है जो वर्तमान थ्रेड की बाधित स्थिति को लौटाता है और उस बाधा ध्वज को साफ करता है। आमतौर पर धागा कुछ ऐसा कर सकता है जैसे कि इंटरप्टेड एक्ससेप्शन फेंकना।
EDIT (थिलो टिप्पणियों से): कुछ एपीआई तरीकों ने इंटरप्ट हैंडलिंग में बनाया है। मेरे सिर के शीर्ष में यह शामिल है।
Object.wait()
, Thread.sleep()
औरThread.join()
java.util.concurrent
संरचनाएँInterruptedException
करने के बजाय उपयोग नहीं करता है ClosedByInterruptException
।EDIT ( @ थोमस-पोर्निन की पूर्णता के लिए एक ही प्रश्न का उत्तर )
थ्रेड रुकावट एक थ्रेड को कुतरने का एक कोमल तरीका है। इसका उपयोग थ्रेड्स को सफाई से बाहर निकलने का मौका देने के लिए किया जाता है , क्योंकि इसके विपरीत Thread.stop()
थ्रेड को राइफल से शूट करना अधिक पसंद है।
क्या है रुकावट?
एक बाधा एक धागे के लिए एक संकेत है कि इसे रोकना चाहिए कि यह क्या कर रहा है और कुछ और करना है। यह प्रोग्रामर पर निर्भर करता है कि वह यह तय करे कि एक थ्रेड एक बाधा का जवाब कैसे देता है, लेकिन थ्रेड को समाप्त करना बहुत आम है।
इसे कैसे लागू किया जाता है?
इंटरप्ट मैकेनिज्म को इंटरनल फ्लैग के रूप में लागू किया जाता है जिसे इंटरप्ट स्टेटस कहा जाता है। Invasion Thread.interrupt इस ध्वज को सेट करता है। जब कोई थ्रेड स्थिर पद्धति को इनवॉइस करने के लिए जाँच करता है। गैर-स्थैतिक Thread.isInterrupted, जिसका उपयोग एक थ्रेड द्वारा दूसरे की रुकावट की स्थिति को क्वेरी करने के लिए किया जाता है, रुकावट के झंडे को नहीं बदलता है।
Thread.interrupt()
एपीआई से उद्धरण :
इस धागे को बाधित करता है। पहले इस थ्रेड का चेकऑउट विधि लागू किया जाता है, जिससे SecurityException को फेंक दिया जा सकता है।
यदि यह थ्रेड प्रतीक्षा (), प्रतीक्षा (लंबी), या प्रतीक्षा (ऑब्जेक्ट की लंबी, int) विधियों के एक मंगलाचरण में अवरुद्ध है, या शामिल होने () में शामिल हों, (लंबी), सम्मिलित हों (लंबी, int) , नींद (लंबी), या नींद (लंबी, इंट), इस वर्ग के तरीके, फिर इसकी रुकावट की स्थिति को साफ कर दिया जाएगा और इसे एक इंटरप्टेड अपवाद प्राप्त होगा।
यदि यह थ्रेड एक अवरोधी चैनल पर I / O ऑपरेशन में अवरुद्ध होता है तो चैनल बंद हो जाएगा, थ्रेड की रुकावट स्थिति सेट हो जाएगी, और थ्रेड एक ClosedByInterruptException प्राप्त करेगा।
यदि यह थ्रेड एक चयनकर्ता में अवरुद्ध है, तो थ्रेड की रुकावट की स्थिति सेट हो जाएगी और यह चयन ऑपरेशन से तुरंत वापस आ जाएगी, संभवत: गैर-शून्य मान के साथ, जैसे कि चयनकर्ता की वेकअप विधि को लागू किया गया था।
यदि पिछली कोई भी शर्त नहीं है, तो इस थ्रेड की रुकावट की स्थिति निर्धारित की जाएगी।
उसी के बारे में पूरी समझ के लिए इसे देखें:
http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
यदि लक्षित धागा प्रतीक्षा कर रहा है (कॉल करके wait()
, या कुछ अन्य संबंधित तरीके जो अनिवार्य रूप से एक ही काम करते हैं, जैसे कि sleep()
), तो यह बाधित हो जाएगा, जिसका अर्थ है कि वह इंतजार कर रहा है जो इसके लिए इंतजार कर रहा था और इसके बजाय एक InterruptedException प्राप्त करता है।
यह पूरी तरह से स्वयं थ्रेड (कोड जिसे कहा जाता है wait()
) पर निर्भर करता है कि इस स्थिति में क्या करना है। यह स्वचालित रूप से थ्रेड को समाप्त नहीं करता है।
इसे कभी-कभी समाप्ति ध्वज के साथ संयोजन में उपयोग किया जाता है। जब बाधित होता है, तो धागा इस ध्वज की जांच कर सकता है, और फिर खुद को बंद कर सकता है। लेकिन फिर, यह सिर्फ एक सम्मेलन है।
पूर्णता के लिए, अन्य उत्तरों के अलावा, यदि थ्रेड को ब्लॉक Object.wait(..)
या Thread.sleep(..)
आदि से पहले बाधित किया जाता है, तो यह उस विधि पर अवरुद्ध होने पर तुरंत बाधित होने के बराबर है , जैसा कि निम्नलिखित उदाहरण से पता चलता है।
public class InterruptTest {
public static void main(String[] args) {
Thread.currentThread().interrupt();
printInterrupted(1);
Object o = new Object();
try {
synchronized (o) {
printInterrupted(2);
System.out.printf("A Time %d\n", System.currentTimeMillis());
o.wait(100);
System.out.printf("B Time %d\n", System.currentTimeMillis());
}
} catch (InterruptedException ie) {
System.out.printf("WAS interrupted\n");
}
System.out.printf("C Time %d\n", System.currentTimeMillis());
printInterrupted(3);
Thread.currentThread().interrupt();
printInterrupted(4);
try {
System.out.printf("D Time %d\n", System.currentTimeMillis());
Thread.sleep(100);
System.out.printf("E Time %d\n", System.currentTimeMillis());
} catch (InterruptedException ie) {
System.out.printf("WAS interrupted\n");
}
System.out.printf("F Time %d\n", System.currentTimeMillis());
printInterrupted(5);
try {
System.out.printf("G Time %d\n", System.currentTimeMillis());
Thread.sleep(100);
System.out.printf("H Time %d\n", System.currentTimeMillis());
} catch (InterruptedException ie) {
System.out.printf("WAS interrupted\n");
}
System.out.printf("I Time %d\n", System.currentTimeMillis());
}
static void printInterrupted(int n) {
System.out.printf("(%d) Am I interrupted? %s\n", n,
Thread.currentThread().isInterrupted() ? "Yes" : "No");
}
}
आउटपुट:
$ javac InterruptTest.java
$ java -classpath "." InterruptTest
(1) Am I interrupted? Yes
(2) Am I interrupted? Yes
A Time 1399207408543
WAS interrupted
C Time 1399207408543
(3) Am I interrupted? No
(4) Am I interrupted? Yes
D Time 1399207408544
WAS interrupted
F Time 1399207408544
(5) Am I interrupted? No
G Time 1399207408545
H Time 1399207408668
I Time 1399207408669
इम्प्लांटेशन: यदि आप निम्न की तरह लूप करते हैं, और अंतरायन ठीक उस समय होता है जब नियंत्रण छोड़ दिया जाता है Thread.sleep(..)
और लूप के चारों ओर जा रहा होता है, तब भी अपवाद होने वाला होता है। तो यह पूरी तरह से सुरक्षित है कि थ्रेड बाधित होने के बाद इंटरप्रिटेड अपवाद पर भरोसेमंद रूप से फेंका जाए :
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException ie) {
break;
}
}
Thread.interrupt()
लक्ष्य थ्रेड की बाधित स्थिति / ध्वज को सही पर सेट करता है, जिसका उपयोग करके चेक किए Thread.interrupted()
जाने पर अंतहीन थ्रेड को रोकने में मदद मिल सकती है। Http://www.yegor256.com/2015/10/20/interrupted-exception.html देखें
थ्रेड रुकावट ध्वज अवरोध स्थिति पर आधारित है । प्रत्येक थ्रेड के लिए डिफ़ॉल्ट स्थिति का मान झूठा सेट किया गया है । जब भी थ्रेड () विधि को थ्रेड पर बुलाया जाता है, तो रुकावट की स्थिति सही होती है ।
सार्वजनिक शून्य व्यवधान ()
इस धागे को बाधित करता है।
जब तक कि वर्तमान थ्रेड स्वयं को बाधित नहीं कर रहा है, जिसे हमेशा अनुमति दी जाती है, इस थ्रेड की चेक विधि को लागू किया जाता है, जिसके कारण SecurityException को फेंक दिया जा सकता है।
यदि यह थ्रेड प्रतीक्षा (), प्रतीक्षा (लंबी), या प्रतीक्षा (ऑब्जेक्ट की लंबी, int) विधियों के एक मंगलाचरण में अवरुद्ध है, या शामिल होने () में शामिल हों, (लंबी), सम्मिलित हों (लंबी, int) , नींद (लंबी), या नींद (लंबी, इंट), इस वर्ग के तरीके, फिर इसकी रुकावट की स्थिति को साफ कर दिया जाएगा और इसे इंटरप्टेड अपवाद प्राप्त होगा।
यदि यह थ्रेड एक अवरोधी चैनल पर I / O ऑपरेशन में अवरुद्ध होता है तो चैनल बंद हो जाएगा, थ्रेड की रुकावट स्थिति सेट हो जाएगी, और थ्रेड एक ClosedByInterruptException प्राप्त करेगा।
यदि यह थ्रेड एक चयनकर्ता में अवरुद्ध है, तो थ्रेड की रुकावट की स्थिति सेट हो जाएगी और यह चयन ऑपरेशन से तुरंत वापस आ जाएगी, संभवत: गैर-शून्य मान के साथ, जैसे कि चयनकर्ता की वेकअप विधि को लागू किया गया था।
यदि पिछली कोई भी शर्त नहीं है, तो इस थ्रेड की रुकावट की स्थिति निर्धारित की जाएगी।
एक धागे को बाधित करना जो जीवित नहीं है, किसी भी प्रभाव की आवश्यकता नहीं है।
फेंकता है: SecurityException - यदि वर्तमान थ्रेड इस थ्रेड को संशोधित नहीं कर सकता है
एक बाधा एक धागे के लिए एक संकेत है कि इसे रोकना चाहिए कि यह क्या कर रहा है और कुछ और करना है। यह प्रोग्रामर पर निर्भर करता है कि वह यह तय करे कि एक थ्रेड एक बाधा का जवाब कैसे देता है, लेकिन थ्रेड को समाप्त करना बहुत आम है। एक बहुत अच्छा संदर्भ: https://docs.oracle.com/javase/tutorial/essential/concurrency/interception.html
Thread.interrupt () विधि आंतरिक 'बाधा स्थिति' ध्वज सेट करती है। आमतौर पर उस ध्वज को Thread.interrupted () विधि द्वारा जांचा जाता है।
कन्वेंशन द्वारा, किसी भी विधि जो इंटरप्टेडएक्ससेप्शन के माध्यम से मौजूद है, को इंटरप्ट स्टेटस फ्लैग को क्लियर करना होगा।