2013-10-03 7 views
5

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

+0

मुझे न तो। जुड़ें() थ्रेडपूल और ऐप-आजीवन धागे का उपयोग करने के बजाय धागे को लगातार बनाए/समाप्त/नष्ट करने का निमंत्रण है, इसलिए सृजन आदि पर समय/सीपीयू बर्बाद कर रहा है। जुड़ें() बंद होने पर जीयूआई ऐप्स को डेडलॉक करने के लिए भी अच्छा है, इसलिए प्रक्रिया समाप्त होने से रोकना। अस्तित्व में शायद सबसे खराब अंतर-थ्रेड comms तंत्र। –

उत्तर

5

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

उदाहरण के लिए, 5 काम आइटमों को लॉन्च करना, प्रत्येक को अपने धागे में लॉन्च करना, फिर 5 थ्रेड पर join() पर कॉल करना आपको सभी 5 वस्तुओं को एक साथ संसाधित करने की अनुमति देगा, लेकिन जब तक वे पूरा नहीं हो जाते हैं तब तक ब्लॉक करें।

ध्यान दें कि कई भाषाओं/ढांचे के पास स्पष्ट रूप से धागे में शामिल होने से बेहतर विकल्प हैं। उदाहरण के लिए, .NET दुनिया में, टीपीएल आपको निरंतरता निर्धारित करने की अनुमति देता है जो तब होता है जब एक या अधिक कार्य (जिसे वांछित थ्रेड पर मैप किया जा सकता है) पूरा हो जाता है।

+0

+1 'thread.join()' की एक और महत्वपूर्ण विशेषता स्मृति सिंक्रनाइज़ेशन है। थ्रेड जो 'join()' को सफल करता है, जो सफल होता है, और अधिक थ्रेड पैकेज के साथ, जो थ्रेड द्वारा बनाए गए मेमोरी अपडेट को देखता है, उसे देखता है। – Gray

2

कुछ स्थितियों में आप धागे का एक समूह के लिए इसी तरह के कार्यों के हाथ बाहर हो सकता है, लेकिन आप 'जवाब' आप देख रहे हैं पाने के लिए पूरा करने के लिए उन सभी को जरूरत है।

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

3

कभी-कभी आप समवर्ती चीजों की एक गुच्छा होने के लिए चाहते हैं, और जब वे सब कर रहे हैं, आप अपने सभी परिणामों को जोड़ सकते हैं और आगे ले जाना चाहते हैं। उदाहरण के लिए

लें एक वेब पोर्टल मुख पृष्ठ पर सर्वर साइड पर स्वतंत्र विगेट्स का एक समूह के लिए डेटा लोड करने की आवश्यकता है। आप उन डेटा लोड को समानांतर में लॉन्च कर सकते हैं, और उसके बाद मुख्य पृष्ठ को प्रस्तुत करने से पहले मुख्य धागा उन पर शामिल हो सकता है (यानी उन्हें समाप्त करने का इंतजार)।

-4

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

यदि आप इसका उपयोग करने से बच सकते हैं, तो ऐसा करें।

+0

मैंने डाउन-वोट किया क्योंकि मैंने पूरी तरह से उचित कोड देखा है जो जेटी में जॉइन() का उपयोग करता है, जो एक उचित जटिल एप्लीकेशन है। इसे थ्रेड पूल में थ्रेड के लिए इंतजार करने के लिए शटडाउन के दौरान इस्तेमाल किया गया था। Java.util.concurrent में बेहतर विकल्प हैं, लेकिन यदि आप जावा के पुराने संस्करणों का समर्थन करना चाहते हैं तो इसका कोई उपयोग नहीं है। –

+0

मैंने विभिन्न भाषाओं में जॉइन(), TThread.WaitFor इत्यादि का उपयोग करके देवताओं को रोकने की कोशिश में 3 दशकों की तरह बिताया है। मेरा विचार वही रहता है। –

+0

आपको मनाने की कोशिश नहीं कर रहा है (असल में, मैं मानता हूं कि लगभग हमेशा बेहतर विकल्प होते हैं)। बस नीचे मतदान की व्याख्या। –

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