2013-03-18 3 views
22

जावा Thread स्वयं जावा Runnable लागू करता है! और इंटरनेट पर अधिकांश विशेषज्ञों के मुताबिक, implements Runnable is preferred over extends Thread! भले ही थ्रेड क्लास के साथ धागे की भावना में we cannot use utilize Runnable!
फिर क्यों हम के बाद से Thread विस्तार से अधिक Runnable लागू करने के लिए पसंद करते हैं करना दोनों ही मामलों वास्तविक धागा एक Thread कार्यान्वित विधि (यानी start() या run()) बुला हालांकि Thread के मामले में हम नहीं वास्तव में Thread की कार्यक्षमता "विस्तृत होकर" कर रहे हैं द्वारा कहा गया है में केवल run() विधि को ओवरराइड करके?क्यों "चलने योग्य लागू" "थ्रेड फैला" पर पसंदीदा है?

मुझे क्षमा है अगर मैं उलझन में लग रहा हूं ..!

+0

धागे मुश्किल है थ्रेड वर्ग का विस्तार होगा जाना चाहिए नियंत्रण करने के लिए। बेहतर दृष्टिकोण देखने के लिए निष्पादकों में देखें। वे कॉलबेल और रननेबल लेते हैं, धागे नहीं। –

उत्तर

60

सबसे आम अंतर है:

जब आप थ्रेड वर्ग का विस्तार, आप किसी भी अन्य वर्ग जो आप की आवश्यकता का विस्तार नहीं कर सकते हैं। (जैसा कि आप जानते हैं, जावा एक से अधिक कक्षा में विरासत की अनुमति नहीं देता है)। जब आप रननेबल को लागू करते हैं, तो आप भविष्य में या अब किसी भी अन्य वर्ग को विस्तारित करने के लिए अपनी कक्षा के लिए एक स्थान सहेज सकते हैं।

हालांकि, महत्वपूर्ण अंतर है।

जब आप थ्रेड क्लास को बढ़ाते हैं, तो आपका प्रत्येक थ्रेड अद्वितीय ऑब्जेक्ट बनाता है और इसके साथ सहयोग करता है। जब आप रननेबल लागू करते हैं, तो यह एक ही ऑब्जेक्ट को एकाधिक थ्रेड पर साझा करता है।

चेक करें: http://manikandanmv.wordpress.com/tag/extends-thread-vs-implements-runnable/

+0

यदि भविष्य में या अब, आवेदन के लिए विशिष्ट है, तो हमें पहले से विरासत में मिली कक्षा (थ्रेड से विरासत में प्राप्त) की विरासत की आवश्यकता नहीं है और एप्लिकेशन को स्मृति समस्या का सामना नहीं करना पड़ता है, फिर रननेबल और थ्रेड, दोनों के बराबर अवसर होना चाहिए ..? – Tariq

+0

या फिर वे करेंगे। – Aashray

+0

एक OOP, बुनियादी सिद्धांत है, – footy

4

एक कक्षा में केवल एक सुपरक्लास हो सकता है, लेकिन किसी भी इंटरफेस को लागू कर सकता है। Thread तक विस्तार करके आप किसी और चीज को उपclass करने का अवसर छोड़ देते हैं।

1

जावा केवल एकल विरासत, जिसका अर्थ है कि यदि आप Thread से विरासत आप किसी भी अन्य वर्ग से विरासत में सक्षम नहीं हो जाएगा अनुमति देता है। Runnable इंटरफ़ेस को कार्यान्वित करने में यह सीमा नहीं है, क्योंकि आपकी कक्षा को किसी भी इंटरफेस को लागू करने की अनुमति है।

6

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

अपनी कक्षा Runnable इंटरफ़ेस को लागू तो आप केवल run() तो इस उदाहरण एक अलग Thread बनाता है और हर व्यक्ति थ्रेड अपने कार्यक्रम में एक भी भारी थ्रेड के रूप में अलग से नहीं बल्कि चलाता ओवरराइड है। एक और बात, Java के बाद से एकाधिक वंशानुक्रम का समर्थन नहीं करता, यदि आप Runnable लागू आप का विस्तार कई की समस्याओं से बचने जाएगा, इसलिए यदि आप Runnable इंटरफ़ेस लागू आप किसी भी वर्ग है कि आप के अलावा अन्य आवश्यक हैं विस्तार कर सकते हैं थ्रेड कक्षा।

+0

मेमोरी खपत के बारे में, ... चलाने योग्य निष्पादन होगा और एक नया थ्रेड() कथन वास्तव में समान होगा? (महंगा अगर एकाधिक कॉल एक बार में)? – gumuruh

-3

आप वाकई उलझन में हैं।वैसे भी एक कारण मुझे पता है कि के रूप में हम ही कार्यक्षमता Runnable का उपयोग कर प्राप्त कर सकते हैं, तो हम इसके लिए क्योंकि अगर हम Runnable को लागू करेगा तो हम अन्य वर्ग जो संभव नहीं है विस्तार कर सकते हैं अगर हम

संबंधित मुद्दे