Java.lang.Thread.interrupt () क्या करता है?


जवाबों:


250

Thread.interrupt()लक्ष्य धागे की बाधित स्थिति / ध्वज सेट करता है। फिर उस लक्ष्य थ्रेड में चल रहा कोड MAY बाधित स्थिति को प्रदूषित करता है और इसे उचित रूप से संभालता है। ब्लॉक करने वाले कुछ तरीके Object.wait()तुरंत बाधित स्थिति का उपभोग कर सकते हैं और एक उपयुक्त अपवाद फेंक सकते हैं (आमतौर पर InterruptedException)

जावा में व्यवधान पूर्व-खाली नहीं है। एक और तरीका है कि दोनों थ्रेड्स को व्यवधान को ठीक से संसाधित करने के लिए सहयोग करना है। यदि लक्ष्य धागा बाधित स्थिति को प्रदूषित नहीं करता है तो व्यवधान को प्रभावी ढंग से अनदेखा किया जाता है।

मतदान उस Thread.interrupted()विधि के माध्यम से होता है जो वर्तमान थ्रेड की बाधित स्थिति को लौटाता है और उस बाधा ध्वज को साफ करता है। आमतौर पर धागा कुछ ऐसा कर सकता है जैसे कि इंटरप्टेड एक्ससेप्शन फेंकना।

EDIT (थिलो टिप्पणियों से): कुछ एपीआई तरीकों ने इंटरप्ट हैंडलिंग में बनाया है। मेरे सिर के शीर्ष में यह शामिल है।

  • Object.wait(), Thread.sleep()औरThread.join()
  • अधिकांश java.util.concurrentसंरचनाएँ
  • Java NIO (लेकिन java.io नहीं) और यह उपयोग InterruptedExceptionकरने के बजाय उपयोग नहीं करता है ClosedByInterruptException

EDIT ( @ थोमस-पोर्निन की पूर्णता के लिए एक ही प्रश्न का उत्तर )

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


22
ध्यान दें कि नींद या प्रतीक्षा जैसी विधियाँ इस प्रकार का मतदान करती हैं और InterruptedException को खुद से फेंक देती हैं।
थिलो

1
यदि आप इंटरप्टेबल फ़ाइल I / O का उपयोग कर रहे हैं, तो प्रभाव उतना कोमल नहीं होगा। आप आम तौर पर फ़ाइल भ्रष्टाचार प्राप्त करेंगे।
Marko Topolnik

यदि आप Thread.interrupted का उल्लेख कर रहे हैं, तो ऐसा लगता है कि यह उल्लेख किया जाना चाहिए कि एक Thread.isInterrupted ध्वज भी है, जो ध्वज को साफ़ नहीं करता है, जो आमतौर पर एप्लिकेशन डेवलपर्स द्वारा उपयोग के लिए अधिक उपयुक्त बनाता है।
नाथन ह्यूजेस

67

क्या है रुकावट?

एक बाधा एक धागे के लिए एक संकेत है कि इसे रोकना चाहिए कि यह क्या कर रहा है और कुछ और करना है। यह प्रोग्रामर पर निर्भर करता है कि वह यह तय करे कि एक थ्रेड एक बाधा का जवाब कैसे देता है, लेकिन थ्रेड को समाप्त करना बहुत आम है।

इसे कैसे लागू किया जाता है?

इंटरप्ट मैकेनिज्म को इंटरनल फ्लैग के रूप में लागू किया जाता है जिसे इंटरप्ट स्टेटस कहा जाता है। Invasion Thread.interrupt इस ध्वज को सेट करता है। जब कोई थ्रेड स्थिर पद्धति को इनवॉइस करने के लिए जाँच करता है। गैर-स्थैतिक Thread.isInterrupted, जिसका उपयोग एक थ्रेड द्वारा दूसरे की रुकावट की स्थिति को क्वेरी करने के लिए किया जाता है, रुकावट के झंडे को नहीं बदलता है।

Thread.interrupt()एपीआई से उद्धरण :

इस धागे को बाधित करता है। पहले इस थ्रेड का चेकऑउट विधि लागू किया जाता है, जिससे SecurityException को फेंक दिया जा सकता है।

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

यदि यह थ्रेड एक अवरोधी चैनल पर I / O ऑपरेशन में अवरुद्ध होता है तो चैनल बंद हो जाएगा, थ्रेड की रुकावट स्थिति सेट हो जाएगी, और थ्रेड एक ClosedByInterruptException प्राप्त करेगा।

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

यदि पिछली कोई भी शर्त नहीं है, तो इस थ्रेड की रुकावट की स्थिति निर्धारित की जाएगी।

उसी के बारे में पूरी समझ के लिए इसे देखें:

http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html


यह एक आंशिक स्पष्टीकरण है। यह रुकावट के तरीकों को भी बाधित करता है।
लोर्न

@EJP यह सवाल है कि, थ्रेड.इनट्रक्ट () विधि क्या है और यह कैसे काम करती है। मुझे लगता है कि जो कुछ भी मैंने लिंक के साथ पोस्ट किया है, वह उत्तर देता है कि क्या पूछा गया है। मुझे अभी भी समझ नहीं आया कि आप क्या चाहते हैं?
YoK

मैं आपको अपने आंशिक रूप से गलत कथन को ठीक करने की कामना करता हूं कि यह एक ध्वज द्वारा कार्यान्वित किया गया है। वह कहानी का केवल एक हिस्सा है। यह मुझे काफी स्पष्ट लगता है।
लोर्न

@ ईजेपी धन्यवाद अब मैं समझ गया कि आप क्या कह रहे थे। मैंने अपना उत्तर अपडेट कर दिया है और विधि के लिए एपीआई डॉक्टर जोड़ दिया है। यह अवरोधी तरीकों वाले हिस्से को कवर करता है जो मेरे उत्तर से गायब था। आशा है कि मेरा उत्तर अब पूरा लग रहा है :)।
योके

13

यदि लक्षित धागा प्रतीक्षा कर रहा है (कॉल करके wait(), या कुछ अन्य संबंधित तरीके जो अनिवार्य रूप से एक ही काम करते हैं, जैसे कि sleep()), तो यह बाधित हो जाएगा, जिसका अर्थ है कि वह इंतजार कर रहा है जो इसके लिए इंतजार कर रहा था और इसके बजाय एक InterruptedException प्राप्त करता है।

यह पूरी तरह से स्वयं थ्रेड (कोड जिसे कहा जाता है wait()) पर निर्भर करता है कि इस स्थिति में क्या करना है। यह स्वचालित रूप से थ्रेड को समाप्त नहीं करता है।

इसे कभी-कभी समाप्ति ध्वज के साथ संयोजन में उपयोग किया जाता है। जब बाधित होता है, तो धागा इस ध्वज की जांच कर सकता है, और फिर खुद को बंद कर सकता है। लेकिन फिर, यह सिर्फ एक सम्मेलन है।


9 साल पुराना, बेबाक जवाब! +1
एसएनआर

10

पूर्णता के लिए, अन्य उत्तरों के अलावा, यदि थ्रेड को ब्लॉक 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;
    }
}

4

Thread.interrupt()लक्ष्य थ्रेड की बाधित स्थिति / ध्वज को सही पर सेट करता है, जिसका उपयोग करके चेक किए Thread.interrupted()जाने पर अंतहीन थ्रेड को रोकने में मदद मिल सकती है। Http://www.yegor256.com/2015/10/20/interrupted-exception.html देखें


4

थ्रेड रुकावट ध्वज अवरोध स्थिति पर आधारित है । प्रत्येक थ्रेड के लिए डिफ़ॉल्ट स्थिति का मान झूठा सेट किया गया है । जब भी थ्रेड () विधि को थ्रेड पर बुलाया जाता है, तो रुकावट की स्थिति सही होती है

  1. यदि रुकावट की स्थिति = सत्य (रुकावट () ​​पहले से ही थ्रेड पर कहा जाता है), तो वह विशेष धागा सो नहीं सकता । यदि नींद को उस थ्रेड पर बुलाया जाता है, तो अपवाद को फेंक दिया जाता है। अपवाद को फेंकने के बाद फिर से झूठा सेट किया जाता है।
  2. यदि थ्रेड पहले से ही सो रहा है और इंटरप्ट () कहा जाता है, तो थ्रेड स्लीपिंग स्थिति से बाहर आ जाएगा और बाधित अपवाद को फेंक देगा।

1

सार्वजनिक शून्य व्यवधान ()

इस धागे को बाधित करता है।

जब तक कि वर्तमान थ्रेड स्वयं को बाधित नहीं कर रहा है, जिसे हमेशा अनुमति दी जाती है, इस थ्रेड की चेक विधि को लागू किया जाता है, जिसके कारण SecurityException को फेंक दिया जा सकता है।

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

यदि यह थ्रेड एक अवरोधी चैनल पर I / O ऑपरेशन में अवरुद्ध होता है तो चैनल बंद हो जाएगा, थ्रेड की रुकावट स्थिति सेट हो जाएगी, और थ्रेड एक ClosedByInterruptException प्राप्त करेगा।

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

यदि पिछली कोई भी शर्त नहीं है, तो इस थ्रेड की रुकावट की स्थिति निर्धारित की जाएगी।

एक धागे को बाधित करना जो जीवित नहीं है, किसी भी प्रभाव की आवश्यकता नहीं है।

फेंकता है: SecurityException - यदि वर्तमान थ्रेड इस थ्रेड को संशोधित नहीं कर सकता है


1

एक बाधा एक धागे के लिए एक संकेत है कि इसे रोकना चाहिए कि यह क्या कर रहा है और कुछ और करना है। यह प्रोग्रामर पर निर्भर करता है कि वह यह तय करे कि एक थ्रेड एक बाधा का जवाब कैसे देता है, लेकिन थ्रेड को समाप्त करना बहुत आम है। एक बहुत अच्छा संदर्भ: https://docs.oracle.com/javase/tutorial/essential/concurrency/interception.html


1

Thread.interrupt () विधि आंतरिक 'बाधा स्थिति' ध्वज सेट करती है। आमतौर पर उस ध्वज को Thread.interrupted () विधि द्वारा जांचा जाता है।

कन्वेंशन द्वारा, किसी भी विधि जो इंटरप्टेडएक्ससेप्शन के माध्यम से मौजूद है, को इंटरप्ट स्टेटस फ्लैग को क्लियर करना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.