2012-03-24 15 views
11
के लिए एकल runnable वस्तु पासिंग

अगर मैं एक runnable वस्तु बनानेकई धागा कंस्ट्रक्टर्स

Runnable run = new MyRunnable(); 

और फिर दो धागा निर्माताओं के लिए एक ही सटीक वस्तु गुजरती हैं और उन्हें चलाने

new Thread(run).start; 
new Thread(run).start; 
  1. संभव है ? प्रभाव क्या हैं?
  2. अगर मैं थ्रेड.sleep (0) को कॉल करता हूं; कक्षा MyRunnable में, दोनों धागे सो जाएगा क्योंकि वे एक ही वस्तु हैं, या धागा इकाई पूरी तरह से वस्तु से अलग है?
  3. क्या ऐसा करने का कोई कारण होगा, अगर नहीं, तो कृपया उपरोक्त दो प्रश्नों का उत्तर दें, क्योंकि मुझे नहीं लगता कि मैं अभी तक थ्रेड तंत्र को पूरी तरह से समझता हूं?
+4

आप इसे स्वयं का परीक्षण क्यों नहीं करते और देखते हैं? –

+2

धागे के साथ क्या चल रहा है, यह जानने की कोशिश कर रहा है, केवल परीक्षण के माध्यम से, कभी-कभी थ्रेड के तरीके के कारण असंगत परिणाम हो सकते हैं। मैं इस मामले में, मेरे कार्यक्रम की मजबूती के लिए मजबूती नहीं छोड़ना चाहता हूं। – rubixibuc

उत्तर

10
  1. यह निश्चित रूप से संभव है और कानूनी है। यदि आपके Runnable में कोई राज्य नहीं है (कोई फ़ील्ड नहीं है), तो सबकुछ ठीक होगा। यदि आपके Runnable में उत्परिवर्तनीय स्थिति है, तो आपको जावा के कई पारस्परिक बहिष्करण तंत्र जैसे ReentrantLock या synchronized कीवर्ड का उपयोग करने की आवश्यकता हो सकती है। क्योंकि दोनों थ्रेड उसी Runnable ऑब्जेक्ट के फ़ील्ड को म्यूट कर देंगे।

  2. नहीं, आपने दो अलग-अलग थ्रेड बनाए और चलाए। वे बस Runnable.run() पर कॉल करते हैं।

  3. यह संभावना के दायरे से बाहर नहीं है। मैं यह भी नहीं कहूंगा कि यह आवश्यक रूप से खराब अभ्यास है। विशिष्ट स्थितियों में, जहां आप इस पाठक के लिए एक व्यायाम के रूप में छोड़ कर सकते हैं ...

+0

3. एक उपयोगकेस: एक वसंत सिंगलटन घटक को चलाने योग्य के रूप में। –

7

1) संभव है? प्रभाव क्या हैं?

हाँ यह संभव है।

निहितार्थ यह है कि रननेबल में कोई भी राज्य (संभावित रूप से) सभी धागे द्वारा साझा किया जाता है, और उस स्थिति तक पहुंच/अपडेट को ठीक से सिंक्रनाइज़ करने की आवश्यकता होती है।

2) अगर मैं थ्रेड.sleep (0) को कॉल करता हूं; कक्षा MyRunnable में, दोनों धागे सो जाएगा क्योंकि वे एक ही वस्तु हैं, या धागा इकाई पूरी तरह से वस्तु से अलग है?

नहीं, वे नहीं करेंगे।

थ्रेड Runnable से तर्कसंगत रूप से अलग है। Thread.sleep() पर कॉल करने से Runnable और अन्य थ्रेड सीधे इसे प्रभावित नहीं कर सकते हैं। (यह अन्य थ्रेड परोक्ष रूप से प्रभाव सकता है, उदाहरण के लिए अगर एक धागा सोता है, जबकि यह Runnable के आदिम लॉक रोक रखा है, और अन्य धागे प्रगति करने के लिए ताला प्राप्त करने के लिए की जरूरत है।)

3) वहाँ कभी एक कारण होगा ऐसा करने के लिए, यदि नहीं, तो कृपया उपरोक्त दो प्रश्नों का उत्तर दें, क्योंकि मुझे नहीं लगता कि मैं अभी तक थ्रेड तंत्र को पूरी तरह से समझता हूं?

आप पराक्रम ऐसा करने अगर कोई धागा विशेष Runnable के साथ जुड़े राज्य है और आप अंतरिक्ष ओवरहेड्स, या Runnable आरंभ की ओवरहेड्स कम करने के लिए करना चाहता था। लेकिन इस तरह के उपयोग-मामलों अभ्यास में दुर्लभ हैं।

वास्तविक दुनिया के उपयोग के अधिकांश मामलों में-प्रत्येक थ्रेड को एक अलग Runnable उदाहरण की आवश्यकता होती है।

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