2012-04-30 14 views
33

मेरे द्वारा पोस्ट किए गए question की निरंतरता में, मैं अपने कोडबेस में ThreadPoolExecutor का उपयोग करने का प्रयास कर रहा हूं। जावा एपीआई दस्तावेज़ से समझने के बार-बार प्रयास करने के बाद भी, मैं कन्स्ट्रक्टर में पास होने के लिए keepAliveTime पैरामीटर के पीछे कार्यक्षमता/उद्देश्य को स्पष्ट रूप से समझने में विफल रहा। उम्मीद है कि कोई मुझे कुछ अच्छे कामकाजी उदाहरण के साथ समझा सकता है।ThreadPoolExecutor के साथ कैसे रहते हैं?

अंशः जावा दस्तावेज़ से:

public ThreadPoolExecutor(int corePoolSize, 
          int maximumPoolSize, 
          long keepAliveTime, 
          TimeUnit unit, 
          BlockingQueue<Runnable> workQueue) 

keepAliveTime - जब धागे की संख्या कोर से अधिक है, यह अधिक से अधिक समय है कि अतिरिक्त निष्क्रिय धागे नए कार्य के लिए इंतजार करेंगे है समाप्त करने से पहले।

+2

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

+0

हां, आप सही हैं। मैं बस इसका मतलब यह था कि यह मेरे कोडबेस में एक नया प्रकार का कार्यान्वयन है। – Gnanam

+0

लेकिन यह * 'ThreadPoolExecutor' का कार्यान्वयन * नहीं है। यह वास्तव में सहायक है यदि आप उचित रूप से शब्दावली का उपयोग कर सकते हैं - * विशेष रूप से * स्टैक ओवरफ़्लो पर। –

उत्तर

47

मान लें कि आपके पास 5 का मूल आकार है, और अधिकतम आकार 15 है। किसी कारण से आपका पूल व्यस्त हो जाता है, और सभी 15 उपलब्ध धागे का उपयोग करता है। आखिर में आप काम करने से बाहर निकलते हैं - इसलिए आपके कुछ धागे निष्क्रिय हो जाते हैं क्योंकि वे अपना अंतिम कार्य पूरा करते हैं। तो उन धागे में से 10 को मरने की अनुमति है।

हालांकि, उन्हें बहुत जल्दी से मारने से बचने के लिए, आप जीवित समय निर्दिष्ट कर सकते हैं। इसलिए यदि आपने keepAliveTime मान और TimeUnit.MINUTEunit मान के रूप में 1 निर्दिष्ट किया है, तो प्रत्येक धागा यह देखने के लिए एक कार्य निष्पादित करने के एक मिनट बाद इंतजार करेगा कि यह देखने के लिए और अधिक काम है या नहीं। अगर इसे अभी भी कोई और काम नहीं दिया गया है, तो यह पूल में "कोर" - पूल में केवल 5 धागे होने तक ही खुद को पूरा कर देगा।

<dt>Keep-alive times</dt> 
* 
* <dd>If the pool currently has more than corePoolSize threads, 
* excess threads will be terminated if they have been idle for more 
* than the keepAliveTime (see {@link 
* ThreadPoolExecutor#getKeepAliveTime}). This provides a means of 
* reducing resource consumption when the pool is not being actively 
* used. If the pool becomes more active later, new threads will be 
* constructed. This parameter can also be changed dynamically 
* using method {@link ThreadPoolExecutor#setKeepAliveTime}. Using 
* a value of <tt>Long.MAX_VALUE</tt> {@link TimeUnit#NANOSECONDS} 
* effectively disables idle threads from ever terminating prior 
* to shut down. 
* </dd> 
* 

अनिवार्य रूप से यह केवल आपके धागे बेकार पूल में छोड़ दिया की संख्या को नियंत्रित करने के लिए अनुमति देता है:

+2

यदि मैं इसे सही ढंग से समझ गया, तो 'keepAliveTime' का उपयोग केवल प्रभावी "होता है जब पूल में धागे कोर आकार से अधिक होते हैं। यह * लागू नहीं है जब पूल में धागे कोर आकार से नीचे हैं। – Gnanam

+0

क्षमा करें, अगर यह सवाल बहुत बुनियादी है। लेकिन हम धागे को जिंदा क्यों रखना चाहते हैं जो वास्तव में एक कार्य निष्पादित कर चुका है? किसी भी तरह, पूल में अनुमत धागे की अधिकतम संख्या ('maxPoolSize') सीमित है? – Gnanam

+2

हत्याओं के धागे का बिंदु पहली जगह में थ्रेड पूल रखने के बिंदु के समान है - अनावश्यक संसाधनों को बर्बाद नहीं करना। –

3

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

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