"हाय, अमिगो!
"प्रत्येक नवीन गोष्ट म्हणजे जुनी गोष्ट आहे जी आपण विसरलो आहोत. आज मी थ्रेड्स थांबवण्याबद्दल बोलणार आहे. मला आशा आहे की तुम्ही इंटरप्ट() पद्धत कशी कार्य करते हे आधीच विसरला असेल."
"हो, एली, मी ते पूर्णपणे विसरले आहे."
"छान. मग मी तुला आठवण करून देईन."
"जावामध्ये, जर एखाद्याला चालू असलेला थ्रेड थांबवायचा असेल, तर तो थ्रेडला हे संकेत देऊ शकतो. हे करण्यासाठी, तुम्हाला थ्रेड ऑब्जेक्टचे hidden isInterrupted व्हेरिएबल सत्य वर सेट करावे लागेल."
"प्रत्येक थ्रेडमध्ये एक व्यत्यय() पद्धत असते, जी हा ध्वज सेट करण्यासाठी वापरली जाते. जेव्हा व्यत्यय () पद्धत कॉल केली जाते, तेव्हा थ्रेड ऑब्जेक्टमधील isInterrupted व्हेरिएबल सत्य वर सेट केले जाते."
"आणि जेव्हा Thread.sleep() किंवा join() पद्धत थ्रेडवर कॉल केली जाते, तेव्हा पद्धत वर्तमान थ्रेडसाठी isInterrupted फ्लॅग सेट आहे की नाही हे तपासते. जर हा ध्वज सेट केला असेल (व्हेरिएबल isInterrupted equals true), तर पद्धती InterruptedException टाका ."
"येथे, मी तुम्हाला एका जुन्या उदाहरणाची आठवण करून देतो:"
कोड | वर्णन |
---|---|
|
घड्याळाच्या रन पद्धतीमुळे सध्याच्या थ्रेडसाठी थ्रेड ऑब्जेक्ट मिळतो.
जोपर्यंत सध्याच्या थ्रेडचे isInterrupt व्हेरिएबल चुकीचे आहे तोपर्यंत क्लॉक क्लास कन्सोलला प्रति सेकंद एकदा "टिक" हा शब्द लिहितो. जेव्हा isInterrupt सत्य होते, तेव्हा रन पद्धत समाप्त होते. |
|
मुख्य धागा एक लहान धागा (घड्याळ) सुरू करतो जो कायमचा चालू असावा.
10 सेकंद प्रतीक्षा करा आणि व्यत्यय पद्धतीवर कॉल करून कार्य रद्द करा. मुख्य धागा त्याचे काम पूर्ण करतो. घड्याळाचा धागा त्याचे काम पूर्ण करतो. |
"येथे आपण रन मेथडमध्ये अनंत लूपचा भाग म्हणून स्लीप पद्धत वापरतो . लूपमध्ये, isInterrupt व्हेरिएबल आपोआप तपासले जाते. जर थ्रेडने स्लीप मेथडला कॉल केला, तर पद्धत प्रथम तपासते की त्या थ्रेडसाठी इंटरप्ट खरे आहे की नाही ( ज्याला झोपेची पद्धत म्हटले जाते). जर ते खरे असेल, तर पद्धत झोपणार नाही. त्याऐवजी, ती एक InterruptedException टाकते ."
"परंतु या उदाहरणात, आम्ही लूपच्या स्थितीत isInterrupted व्हेरिएबल सतत तपासतो."
"मला आठवते की आम्ही हा दृष्टिकोन का वापरू शकलो नाही याची काही कारणे होती. तुम्ही मला आठवण करून देऊ शकाल का?"
" प्रथम , रन मेथडमध्ये नेहमी लूप नसतो. या पद्धतीमध्ये इतर पद्धतींवरील काही डझन कॉल्स असू शकतात. या प्रकरणात, प्रत्येक मेथड कॉल करण्यापूर्वी तुम्हाला एक isInterrupted चेक जोडावा लागेल."
" दुसरे , अनेक भिन्न क्रियांचा समावेश असलेली काही पद्धत अंमलात आणण्यासाठी खूप वेळ लागू शकतो."
" तिसरे , अपवाद फेकणे isInterrupted check बदलत नाही. हे फक्त एक सोयीस्कर जोड आहे. फेकलेला अपवाद तुम्हाला कॉल स्टॅकला रन मेथडवर परत त्वरीत अनवाइंड करू देतो . "
" चौथे , झोपेची पद्धत खूप वापरली जाते. असे दिसून आले की ही उपयुक्त पद्धत एका गर्भित तपासणीद्वारे वर्धित केली गेली आहे जी कमी उपयुक्त नाही. असे आहे की कोणीही विशेषतः चेक जोडले नाही, परंतु ते तेथे आहे. जेव्हा तुम्ही दुसऱ्याचा कोड वापरत आहे आणि तुम्ही स्वतः चेक जोडू शकत नाही.
" पाचवा , अतिरिक्त तपासणीमुळे कार्यप्रदर्शन खराब होत नाही. स्लीप पद्धतीला कॉल करणे म्हणजे थ्रेड काहीही करत नसावा (झोपण्याशिवाय), त्यामुळे अतिरिक्त काम कोणालाही त्रास देत नाही."
"तुम्ही आधी सांगितले होते तेच आहे."
"आणि तुमच्या विधानाचे काय, « धागा बंद केला जाईल याची खात्री कोणीही देऊ शकत नाही. फक्त एक धागा स्वतःच थांबू शकतो. » तुम्ही ते स्पष्ट करू शकता का?"
"नक्की."
"पूर्वी, Java च्या सुरुवातीच्या आवृत्त्यांमध्ये, थ्रेड्सना stop() पद्धत होती. आणि जेव्हा तुम्ही कॉल केला तेव्हा JVM ने थ्रेड थांबवला. पण जर एखादा थ्रेड JVM च्या बाहेर काहीतरी करत असेल (उदाहरणार्थ, फाईलवर लिहिणे किंवा कॉल करणे OS फंक्शन्स) जेव्हा अशा प्रकारे व्यत्यय आणला गेला, तेव्हा व्यत्ययामुळे बर्याच समस्या उद्भवल्या, जसे की अनक्लोज्ड फाइल्स, रिलीझ न केलेले सिस्टम रिसोर्स इ."
"जावाच्या निर्मात्यांच्या सर्वसाधारण सभेने थ्रेड्स जबरदस्तीने थांबवण्याची पद्धत काढून टाकण्याचा निर्णय घेतला. आता आम्ही फक्त एक विशिष्ट ध्वज (isInterrupted) सेट करू शकतो आणि आशा करतो की थ्रेड कोड योग्यरित्या लिहिला गेला आहे, जेणेकरून या ध्वजावर प्रक्रिया केली जाईल. हा ध्वज 'धागा, थांबा, प्लीज. हे खूप महत्त्वाचे आहे!' असे म्हणणाऱ्या चिन्हासारखे आहे. पण तो थांबतो की नाही हा त्याचा स्वतःचा व्यवसाय आहे."
"पण InterruptedException बद्दल काय?"
"या थ्रेडवर चालणार्या कोडमध्ये ट्राय-कॅच ब्लॉक्सचा एक समूह असेल तर? कुठेतरी व्यत्यय आला असला तरीही, काही ट्राय-कॅच ते पकडतील आणि विसरतील याची खात्री नाही. त्यामुळे कोणतीही हमी नाही. धागा थांबेल."
"आणखी एक गोष्ट अशी आहे की थ्रेड्सना आधीच कमी-स्तरीय प्रोग्रामिंग मानले जाते. पण मी तुम्हाला त्याबद्दल पुढच्या वेळी सांगेन."
"तू एली नाहीस - तू शेहेराजादे आहेस!"
"तर, अमिगो! सध्याच्या धड्यात सर्व काही स्पष्ट आहे का?"
"हो."
"ठीक आहे, छान."
GO TO FULL VERSION