2010-07-16 20 views
23

मैं बजाय निष्पादकों का उपयोग कर ThreadGroup की की वर्तमान अभ्यास के बारे में पता कर रहा हूँ:क्यों थ्रेड ग्रुप की आलोचना की जा रही है?

  • आम तौर पर पसंदीदा तरीका धागे
  • धागे, आदि से अपवादों को पकड़ने से निपटने के लिए ...

हालांकि, अंतर्निहित थ्रेड ग्रुप की त्रुटियों के रूप में हैं (मैंने उस वर्ग के लिए अस्पष्ट आलोचना सुनाई है)?

उत्तर के लिए धन्यवाद।

पीएस। this इस प्रश्न का उत्तर नहीं दे रहा है।

+6

अरघ मुझे इससे नफरत है जब लोग कहते हैं कि "थ्रेड ग्रुप का उपयोग न करें"। यह कहने की तरह है "थ्रेड का उपयोग न करें"। थ्रेड में थ्रेड ग्रुप होता है, उसके आसपास कोई नहीं होता है, इसलिए जब तक कि आप कोई थ्रेड वाले प्रोग्राम नहीं चाहते हैं, ** आप थ्रेड ग्रुप ** का उपयोग कर रहे हैं। मैं मानता हूं कि हमें * प्रश्न, कैसे और क्यों * उनका उपयोग नहीं करने के लिए एक प्रश्न की आवश्यकता है। मार्क पीटर्स के कारणों के कारण –

+0

+1, और क्योंकि यह प्रश्न ऐसा करने के लिए एक अच्छा वाहन है। –

+0

यह समुदाय विकी क्यों है? –

उत्तर

30

यह Effective Java 2nd Ed. से समझाया गया है, मद 73.

थ्रेड समूहों मूल रूप से सुरक्षा उद्देश्यों के लिए एप्लेट अलग करने के लिए एक तंत्र के रूप में कल्पना कर रहे थे। वे वास्तव में इस वादा निभाया कभी नहीं, और उनकी सुरक्षा महत्व इस हद तक कि वे भी जावा सुरक्षा मॉडल [Gong03] पर मानक काम में उल्लेख नहीं कर रहे हैं करने के लिए कम हो गया है।

[...] एक विडंबनात्मक मोड़ में, ThreadGroup एपीआई थ्रेड सुरक्षा स्टैंडपॉइंट से कमजोर है। एक सूत्र के समूह में सक्रिय धागे की एक सूची प्राप्त करने के लिए आपको आह्वान चाहिए enumerate विधि है, जो एक पैरामीटर एक सरणी काफी बड़ी सभी सक्रिय सूत्र धारण करने के लिए के रूप में लेता है। activeCount विधि एक धागा समूह में सक्रिय थ्रेड की संख्या देता है, लेकिन कोई गारंटी नहीं है कि इस गणना अभी भी सटीक हो जाएगा एक बार एक सरणी आबंटित की गई है और enumerate विधि को पारित कर दिया है। यदि धागा गिनती बढ़ गया है और सरणी बहुत छोटा है, enumerate विधि चुपचाप किसी भी धागे जिसके लिए सरणी में कोई जगह नहीं है पर ध्यान नहीं देता।

एपीआई कि एक धागा समूह के उपसमूहों को सूचीबद्ध करता है इसी तरह त्रुटिपूर्ण है। इन समस्याओं को नए तरीकों के योग के साथ तय किया जा सकता था, वहीं वे क्योंकि कोई वास्तविक जरूरत नहीं है, नहीं है : धागा समूहों अप्रचलित हैं। ThreadGroup.uncaughtException विधि एक ही तरीका है जब एक धागा न आया हुआ अपवाद फेंक दिया नियंत्रण पाने के लिए किया गया था:

1.5 रिलीज से पहले, कि केवल ThreadGroup एपीआई के साथ उपलब्ध था कार्यक्षमता में से एक छोटा सा टुकड़ा था। यह कार्यक्षमता उपयोगी है, उदाहरण के लिए, किसी अनुप्रयोग में स्टैक निशान को निर्देशित करने के लिए- विशिष्ट लॉग। रिलीज 1.5 के रूप में, हालांकि, समान कार्यक्षमता Thread के setUncaughtExceptionHandler विधि के साथ उपलब्ध है।

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

+0

उद्धरण के लिए धन्यवाद। तो क्या मैं सही ढंग से समझता हूं कि हम अपने अभ्यास में पूरी तरह से थ्रेड ग्रुप से बचने के बावजूद इस तथ्य के बावजूद कि यह अभी भी थ्रेड विधियों के अंदर रहता है: प्रारंभ() और init (थ्रेड ग्रुप जी, रननेबल लक्ष्य, स्ट्रिंग नाम, लंबा स्टैक आकार), बाद में से कहा जाता है थ्रेड() कन्स्ट्रक्टर और हमेशा थ्रेड ग्रुप बनाता है? – Max

+0

सीडब्ल्यू और रेफरी के लिए धन्यवाद। अंत में किताब खरीदी लेकिन अभी तक यह नहीं मिला है। 'UncaughtException' कार्यक्षमता वास्तव में आखिरी बिट थी जिसके बारे में मैं उत्सुक था। –

+0

@ मैक्स सामान्य उद्देश्य लाइब्रेरी कोड को अभी भी पता होना चाहिए कि किस 'थ्रेड ग्रुप' में यह पैड बना रहा है। इसलिए, कुछ उद्देश्यों के लिए, आपको अभी भी इसका सामना करना होगा। –

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