"हाय, अमीगो!

"सब कुछ नया बस कुछ पुराना है जिसे हम भूल गए हैं। आज मैं थ्रेड्स को रोकने के बारे में बात करूँगा। मुझे आशा है कि आप पहले ही भूल गए होंगे कि इंटरप्ट () विधि कैसे काम करती है।"

"हाँ, ऐली, मैं इसे पूरी तरह से भूल गया हूँ।"

"बहुत बढ़िया। फिर मैं आपको याद दिला दूँगा।"

"जावा में, यदि कोई किसी चल रहे थ्रेड को रोकना चाहता है, तो वह इसे थ्रेड को संकेत दे सकता है। ऐसा करने के लिए, आपको थ्रेड ऑब्जेक्ट के छिपे हुए isInterrupted वेरिएबल को सही पर सेट करना होगा।"

"प्रत्येक थ्रेड में एक इंटरप्ट () विधि होती है, जिसका उपयोग इस फ़्लैग को सेट करने के लिए किया जाता है। जब इंटरप्ट () विधि को कॉल किया जाता है, तो थ्रेड ऑब्जेक्ट के अंदर isInterrupted वेरिएबल सही पर सेट होता है।"

"और जब थ्रेड.स्लीप () या जॉइन () विधि को थ्रेड पर कॉल किया जाता है, तो विधि यह जांचती है कि वर्तमान थ्रेड के लिए isInterrupted फ्लैग सेट है या नहीं। यदि यह फ्लैग सेट है (वेरिएबल isInterrupted बराबर सच है), तो विधियाँ एक बाधित अपवाद फेंको ।"

"यहाँ, मैं आपको एक पुराना उदाहरण याद दिलाता हूँ:"

कोड विवरण
class Clock implements Runnable
{
public void run()
{
Thread current = Thread.currentThread();

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tik");
}
}
}
क्लॉक की रन विधि वर्तमान थ्रेड के लिए थ्रेड ऑब्जेक्ट प्राप्त करती है।

क्लॉक क्लास प्रति सेकंड एक बार कंसोल पर "टिक" शब्द लिखता है, जब तक कि वर्तमान थ्रेड का इंटरप्ट वेरिएबल गलत है।

जब इंटरप्ट सत्य हो जाता है, तो रन विधि समाप्त हो जाती है।

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clockThread.interrupt();
}
मुख्य धागा एक बाल धागा (घड़ी) शुरू करता है जो हमेशा चलना चाहिए।

10 सेकंड प्रतीक्षा करें और इंटरप्ट विधि को कॉल करके कार्य को रद्द करें।

मुख्य धागा अपना काम पूरा करता है।

घड़ी का धागा अपना काम पूरा करता है।

"यहाँ हम स्लीप मेथड का उपयोग रन मेथड में एक अनंत लूप के हिस्से के रूप में करते हैं । लूप में, isInterrupt वेरिएबल को स्वचालित रूप से चेक किया जाता है। यदि कोई थ्रेड स्लीप मेथड को कॉल करता है , तो मेथड पहले यह जाँचता है कि क्या isInterrupt उस थ्रेड के लिए सही है (द) एक जिसे स्लीप मेथड कहा जाता है)। अगर यह सच है, तो मेथड स्लीप नहीं करेगा। इसके बजाय, यह एक इंटरप्टेड एक्सेप्शन को फेंकता है ।

"लेकिन इस उदाहरण में, हम लूप की स्थिति में isInterrupted चर की लगातार जाँच करते हैं।"

"मुझे याद है कि कुछ कारण थे कि हम इस दृष्टिकोण का उपयोग क्यों नहीं कर सके। क्या आप मुझे याद दिला सकते हैं?"

" सबसे पहले , रन विधि में हमेशा लूप नहीं होता है। विधि में अन्य विधियों के लिए कुछ दर्जन कॉल शामिल हो सकते हैं। इस मामले में, आपको प्रत्येक विधि कॉल से पहले एक बाधित चेक जोड़ना होगा।"

" दूसरा , कोई विधि जिसमें बहुत सारी विभिन्न कार्रवाइयाँ शामिल हैं, निष्पादित होने में बहुत लंबा समय ले सकती हैं।"

" तीसरा , एक अपवाद फेंकना isInterrupted चेक को प्रतिस्थापित नहीं करता है। यह सिर्फ एक सुविधाजनक जोड़ है। फेंका गया अपवाद आपको कॉल स्टैक को जल्दी से रन विधि में वापस लाने की सुविधा देता है।"

" चौथा , नींद की विधि का बहुत उपयोग किया जाता है। यह पता चला है कि यह सहायक विधि एक अंतर्निहित जांच से बढ़ी है जो कम सहायक नहीं है। ऐसा लगता है  जैसे किसी ने विशेष रूप से चेक नहीं जोड़ा है, लेकिन वहां है।  यह सुपर मूल्यवान है जब आप 'किसी और के कोड का उपयोग कर रहे हैं और आप स्वयं चेक नहीं जोड़ सकते।"

" पांचवां , अतिरिक्त चेक प्रदर्शन को कम नहीं करता है। स्लीप मेथड को कॉल करने का मतलब है कि थ्रेड को कुछ भी नहीं करना चाहिए (स्लीपिंग को छोड़कर), इसलिए अतिरिक्त काम किसी को परेशान नहीं करता है।"

"बिल्कुल वही जो आपने पहले कहा था।"

"और आपके बयान के बारे में क्या है," कोई भी गारंटी नहीं दे सकता है कि एक धागा बंद हो जाएगा। केवल एक धागा खुद को रोक सकता है। »क्या आप इसे समझा सकते हैं?"

"ज़रूर।"

"पहले, जावा के शुरुआती संस्करणों में, थ्रेड्स में एक स्टॉप () विधि थी। और जब आप इसे कॉल करते हैं, तो JVM वास्तव में थ्रेड को रोक देता है। लेकिन अगर कोई थ्रेड JVM के बाहर कुछ कर रहा था (उदाहरण के लिए, फ़ाइल में लिखना या कॉल करना) OS फ़ंक्शंस) जब इसे इस तरह से बाधित किया गया था, तो रुकावट के कारण बहुत सारी समस्याएँ पैदा हुईं, जैसे कि अनक्लोज़्ड फाइल्स, अनरिलीज़ सिस्टम रिसोर्सेज, आदि।

"जावा के रचनाकारों की एक सामान्य बैठक ने थ्रेड्स को जबरन रोकने के लिए विधि को हटाने का फैसला किया। अब हम केवल एक निश्चित ध्वज (isInterrupted) सेट कर सकते हैं और आशा करते हैं कि थ्रेड कोड सही ढंग से लिखा गया था, ताकि इस ध्वज को संसाधित किया जा सके। यह ध्वज एक संकेत की तरह है जो कहता है, 'धागा, रुको, कृपया। यह बहुत महत्वपूर्ण है!' लेकिन यह रुकता है या नहीं यह उसका अपना मामला है।"

"लेकिन बाधित अपवाद के बारे में क्या?"

"क्या होगा यदि इस थ्रेड पर चल रहे कोड में ट्राइ-कैच ब्लॉक का एक गुच्छा है? यहां तक ​​​​कि अगर एक इंटरप्टेड एक्सेप्शन कहीं होता है, तो निश्चित रूप से कोई गारंटी नहीं है कि कुछ ट्राइ-कैच इसे पकड़ नहीं पाएंगे और इसके बारे में भूल जाएंगे। इसलिए इसकी कोई गारंटी नहीं है धागा बंद हो जाएगा।"

"एक और बात यह है कि थ्रेड्स को पहले से ही काफी निम्न-स्तरीय प्रोग्रामिंग माना जाता है। लेकिन मैं आपको इसके बारे में अगली बार बताऊंगा।"

"तुम ऐली नहीं हो - तुम शेहरज़ादे हो!"

"तो, अमीगो! क्या वर्तमान पाठ में सब कुछ स्पष्ट है?"

"हां।"

"ठीक है अच्छा।"