2011-09-20 12 views
5

मैं जावा 5 के ThreadPoolExecutor के लिए अलग कोर और अधिकतम पूल आकार निर्दिष्ट करने में बिंदु को समझने की कोशिश कर रहा हूं। मेरी समझ यह है कि कतार भरने के बाद धागे की संख्या में वृद्धि होती है, जो थोड़ी देर लगती है (कम से कम बड़ी कतारों के साथ)।ThreadPoolExecutor में अलग कोर और अधिकतम पूल आकार निर्दिष्ट करते समय एक अच्छा विचार कब है?

यह नहीं है कि मैं कार्यों में बड़ी संख्या में थ्रेड आवंटित करने में खुश हूं, इस मामले में मैं केवल कोर पूल आकार बढ़ा सकता हूं; या मैं ऐसा करने के लिए वास्तव में तैयार नहीं हूं, इस मामले में मुझे एक बड़ी कतार चाहिए? एक परिदृश्य क्या है जहां अलग कोर और अधिकतम पूल आकार उपयोगी हैं?

उत्तर

2

अंतर यह है कि यदि आप कोर पूल आकार से नीचे हैं, तो प्रत्येक नया कार्य पूल में निष्क्रिय धागे के बावजूद एक नया धागा बनाता है। कतार भरने के बाद धागे की संख्या केवल तभी बढ़ी है जब आप पहले ही कोर पूल आकार से मिले हैं लेकिन अभी भी अधिकतम हैं।

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

यह विशेष रूप से उपयोगी है यदि आपके पास अपेक्षा से अधिक I/O भार है, और आपके पूल में धागे बहुत समय अवरुद्ध करते हैं। आपकी कतार आसानी से इस परिदृश्य में एक बड़ा समवर्ती भार के बिना भर सकती है, और इसे कुछ और समवर्ती अनुरोधों के लिए कुछ नए धागे जोड़कर आसानी से तय किया जा सकता है।

+1

लेकिन तब मैं के साथ शुरू करने के लिए और अधिक धागे के साथ चला सकते हैं - अन्यथा मैं सिर्फ कतार में इंतजार कर रहे कार्यों के विलंबता जोड़ें। मुझे यह भी संदेह है कि कतार में भरने वाले कई परिदृश्यों में तेजी से भर सकता है, इस मामले में अतिरिक्त धागे बहुत देर हो सकते हैं। –

+0

@ पीटर, यदि आपका स्थिर विश्लेषण पर्याप्त भार में उपयोग करने के लिए धागे की सही संख्या की भविष्यवाणी करने के लिए पर्याप्त है और आप सामान्य लोड के दौरान बैठे अतिरिक्त अतिरिक्त थ्रेड रखने से खुश हैं तो इसके लिए जाएं! यह कम लोड में लोड या अतिरिक्त संसाधन उपयोग के तहत एक-ऑफ थ्रेड स्पिन-अप समय के बीच एक व्यापार-बंद है। – Bringer128

4

इस here की चर्चा नहीं है।

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

उद्देश्य, भी क्षणिक भार के तहत, अत्यधिक धागा निर्माण बिना और बहुत अधिक धागा मंथन के बिना उम्मीद कार्यभार संभालने की क्षमता को संतुलित करने के लिए है (यानी बनाने-काम-मर-बनाएँ)।

+0

लिंक मर चुका है? –

+1

यह उत्कृष्ट स्पष्टीकरण है! मृत लिंक को सही किया। उत्तर में दी गई चर्चा http://comments.gmane.org/gmane.comp.java.jsr.166-concurrency/7109 पर मिल सकती है – Shailendra

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