नीचे दिखाए गए तुलना चार्ट की सहायता से थ्रेड और रननेबल के बीच कुछ अन्य अंतरों को देखें:
तुलना चार्ट
तुलना के लिए आधार | धागा | runnable |
---|---|---|
बुनियादी | प्रत्येक धागा एक अनोखी वस्तु बनाता है और उसके साथ जुड़ जाता है। | एकाधिक धागे समान वस्तुओं को साझा करते हैं। |
याद | जैसा कि प्रत्येक थ्रेड एक अद्वितीय ऑब्जेक्ट बनाता है, अधिक मेमोरी की आवश्यकता होती है। | जैसा कि कई थ्रेड साझा करते हैं उसी ऑब्जेक्ट कम मेमोरी का उपयोग किया जाता है। |
विस्तार | जावा में, एकाधिक वंशानुक्रम की अनुमति नहीं है, इसलिए एक वर्ग थ्रेड क्लास का विस्तार करने के बाद, यह किसी अन्य वर्ग का विस्तार नहीं कर सकता है। | यदि कोई वर्ग थ्रेडेबल इंटरफ़ेस को लागू करने वाले थ्रेड को परिभाषित करता है तो उसके पास एक कक्षा को विस्तारित करने का एक मौका है। |
उपयोग | थ्रेड क्लास में अन्य विधियों को ओवरराइड करने के लिए एक उपयोगकर्ता को केवल थ्रेड क्लास का विस्तार करना चाहिए। | अगर आप केवल रन पद्धति को विशेषज्ञ बनाना चाहते हैं तो रननेबल को लागू करना एक बेहतर विकल्प है। |
युग्मन | थ्रेड क्लास का विस्तार तंग युग्मन का परिचय देता है क्योंकि कक्षा में थ्रेड क्लास का कोड होता है और थ्रेड को असाइन किया गया कार्य भी होता है | रननेबल इंटरफ़ेस को लागू करना ढीली युग्मन का परिचय देता है क्योंकि थ्रेड का कोड अलग रूप है थ्रेड्स का काम। |
थ्रेड क्लास की परिभाषा
थ्रेड java.lang पैकेज में एक वर्ग है। थ्रेड क्लास एक ऑब्जेक्ट क्लास का विस्तार करता है, और यह रननेबल इंटरफेस को लागू करता है। थ्रेड क्लास में थ्रेड पर बनाने और संचालित करने के लिए कंस्ट्रक्टर और विधियाँ हैं। जब हम कई थ्रेड बनाते हैं, तो प्रत्येक थ्रेड एक अद्वितीय ऑब्जेक्ट बनाता है और उस ऑब्जेक्ट से जुड़ा होता है। यदि आप थ्रेड क्लास का विस्तार करने वाला एक धागा बनाते हैं, तो आगे आप किसी अन्य वर्ग का विस्तार नहीं कर सकते क्योंकि जावा कई उत्तराधिकार का समर्थन नहीं करता है। इसलिए, आपको केवल तब थ्रेड क्लास का विस्तार करना चाहिए जब आप थ्रेड क्लास के कुछ अन्य तरीकों को भी ओवरराइड करना चाहते हैं। आइए एक थ्रेड क्लास का विस्तार करते हुए एक धागा बनाने का एक उदाहरण देखें।
/ * एक धागा परिभाषित करना * / क्लास मिथ्रेड थ्रेड का विस्तार करता है {/ * थ्रेड का कार्य * / सार्वजनिक शून्य रन () {के लिए (इंट i = 0; मैं <10; i ++;} System.Out.Println ("चाइल्ड थ्रेड") ); }} वर्ग mainThread {/ * मुख्य धागे का काम * / सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग args []) {Mythread mt = new Mythread (); / * मुख्य सूत्र ने बच्चे के धागे का निर्माण किया * / mt.start (); for (int i = 0; i <10; i ++) {System.Out.Print ("मेन थ्रेड"); }}} / * आउटपुट * / मुख्य थ्रेड मेन थ्रेड मेन थ्रेड मेन थ्रेड चाइल्ड थ्रेड चाइल्ड थ्रेड चाइल्ड थ्रेड चाइल्ड थ्रेड मेन थ्रेड मेन थ्रेड मेन थ्रेड थ्रेड थ्रेड मेन थ्रेड मेन थ्रेड थ्रेड थ्रेड मेन थ्रेड
ऊपर दिए गए कोड में, मैं एक क्लास मिथ्रेड बनाता हूं जो थ्रेड क्लास का विस्तार करता है और थ्रेड क्लास की एक रन विधि को ओवरराइड करता है। मुख्य विधि युक्त वर्ग में मैं Mythread वर्ग की एक थ्रेड ऑब्जेक्ट (mt) बनाता हूं और थ्रेड ऑब्जेक्ट का उपयोग करके प्रारंभ () विधि का उपयोग करता हूं। प्रारंभ विधि थ्रेड का निष्पादन शुरू करती है और उसी समय जेवीएम थ्रेड की रन विधि को लागू करता है। अब कार्यक्रम में दो धागे हैं एक मुख्य धागा और दूसरा मुख्य धागा द्वारा बनाया गया बच्चा धागा। दोनों थ्रेड्स का निष्पादन एक साथ होता है, लेकिन, सटीक आउटपुट का ढोंग नहीं किया जा सकता है।
Runnable Interface की परिभाषा
Runnable java.lang पैकेज में एक इंटरफ़ेस है। Runnable इंटरफ़ेस को लागू करना हम एक थ्रेड को परिभाषित कर सकते हैं। Runnable Interface में एक एकल विधि Run () है, जो कि Runnable इंटरफ़ेस को लागू करने वाले वर्ग द्वारा कार्यान्वित की जाती है। जब आप थ्रेडेबल इंटरफ़ेस को लागू करने वाले थ्रेड को परिभाषित करना चुनते हैं तब भी आपके पास किसी अन्य वर्ग को विस्तारित करने का विकल्प होता है। जब आप रननेबल इंटरफ़ेस को लागू करके कई थ्रेड बनाते हैं, तो प्रत्येक थ्रेड एक ही रन करने योग्य उदाहरण साझा करता है। चलिए सीखते हैं कि रननेबल इंटरफ़ेस का उपयोग करके थ्रेड को कैसे परिभाषित करें।
/ * एक धागे को परिभाषित करना * / कक्षा रननेबल के लिए लागू करना Runnable {/ * थ्रेड का कार्य * / सार्वजनिक शून्य रन () {के लिए (int i = 0; मैं <10; i ++;) {System.Out.Pr.Pll ); }} वर्ग mainThread {/ * मुख्य धागे की नौकरी * / सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग args []) {Mythread rt = new Mythread (); / * मुख्य थ्रेड ने रन करने योग्य ऑब्जेक्ट बनाया * * थ्रेड टी = नया थ्रेड (आरटी); / * मुख्य धागा बच्चे के धागे का निर्माण करता है और रन करने योग्य वस्तु को पारित करता है * / t.start (); for (int i = 0; i <10; i ++) {System.Out.Print ("मेन थ्रेड"); }}} / * आउटपुट * / मुख्य थ्रेड मेन थ्रेड मेन थ्रेड मेन थ्रेड चाइल्ड थ्रेड चाइल्ड थ्रेड चाइल्ड थ्रेड चाइल्ड थ्रेड मेन थ्रेड मेन थ्रेड मेन थ्रेड थ्रेड थ्रेड मेन थ्रेड मेन थ्रेड थ्रेड थ्रेड मेन थ्रेड
ऊपर दिए गए कोड में, मैंने एक रन रनटेबल को बनाया है जो रननेबल इंटरफ़ेस को लागू करता है और रननेबल इंटरफ़ेस की रन () विधि को लागू करके धागे की नौकरी को परिभाषित करता है। फिर मैं एक क्लास मेनथ्रेड बनाता हूं जिसमें मुख्य तरीका होता है। मुख्य विधि के अंदर, मैंने रनवेबलथ्रेड की एक रन करने योग्य वस्तु घोषित की और थ्रेड के निर्माता को एक धागा घोषित करते हुए इस ऑब्जेक्ट को पास किया। इस तरह, मैंने थ्रेड ऑब्जेक्ट (टी) को एक रन करने योग्य ऑब्जेक्ट (आरटी) के साथ जोड़ा। फिर थ्रेड ऑब्जेक्ट इनवॉइस थ्रेड की विधि प्रारंभ करता है जो आगे Runnablethread क्लास की रन विधि को आमंत्रित करता है। यदि मैंने थ्रेड ऑब्जेक्ट के साथ रन करने योग्य ऑब्जेक्ट को लिंक नहीं किया था, तो थ्रेड्स प्रारंभ विधि ने थ्रेड क्लास की रन विधि को लागू किया होगा। अब, फिर से कोड में दो धागे हैं, मुख्य धागा और मुख्य धागा बनाता है बच्चे के धागे दोनों को एक साथ निष्पादित किया जाता है, लेकिन सटीक आउटपुट का कभी भी ढोंग नहीं किया जा सकता है।
जावा में थ्रेड और रननेबल के बीच महत्वपूर्ण अंतर
- थ्रेड क्लास का विस्तार करके बनाया गया प्रत्येक धागा इसके लिए एक अनूठी वस्तु बनाता है और उस ऑब्जेक्ट से जुड़ा होता है। दूसरी ओर, एक रननेबल इंटरफ़ेस को लागू करके बनाया गया प्रत्येक थ्रेड एक ही रन करने योग्य उदाहरण साझा करता है।
- चूंकि थ्रेड क्लास को बढ़ाते समय प्रत्येक थ्रेड को एक अनोखी वस्तु के साथ जोड़ा जाता है, इसलिए अधिक मेमोरी की आवश्यकता होती है। दूसरी ओर, रननेबल इंटरफ़ेस को लागू करके बनाया गया प्रत्येक थ्रेड समान ऑब्जेक्ट स्पेस साझा करता है इसलिए, इसे कम मेमोरी की आवश्यकता होती है।
- यदि आप थ्रेड क्लास का विस्तार करते हैं, तो आगे, आप किसी भी अन्य वर्ग को विरासत में दे सकते हैं क्योंकि जावा कई वंशानुक्रम की अनुमति नहीं देता है, जबकि रननेबल को लागू करने के लिए अभी भी एक वर्ग के लिए किसी अन्य वर्ग को विरासत में मौका मिलता है।
- किसी को थ्रेड क्लास का विस्तार केवल तभी करना चाहिए, जब उसे थ्रेड क्लास के कुछ अन्य तरीकों को ओवरराइड या स्पेशलाइज करना हो। यदि आप केवल रन विधि का विशेषज्ञ बनाना चाहते हैं तो आपको एक रनने योग्य इंटरफ़ेस लागू करना होगा।
- थ्रेड क्लास का विस्तार कोड में तंग युग्मन का परिचय देता है क्योंकि थ्रेड का कोड और थ्रेड का काम एक ही वर्ग द्वारा समाहित है। दूसरी ओर, लागू करने योग्य इंटरफ़ेस कोड में ढीले युग्मन का परिचय देता है क्योंकि थ्रेड का कोड थ्रेड को असाइन किए गए कार्य से अलग होता है।
निष्कर्ष:
थ्रेड क्लास को बढ़ाने के बजाय एक रननेबल इंटरफ़ेस लागू करना पसंद किया जाता है। जैसा कि रननेबल को लागू करने से आपका कोड शिथिल हो जाता है क्योंकि धागे का कोड उस वर्ग से अलग होता है जो थ्रेड को काम सौंपता है। इसके लिए कम मेमोरी की आवश्यकता होती है और यह एक वर्ग को किसी भी अन्य वर्ग को विरासत में प्राप्त करने की अनुमति देता है।