2016-01-17 7 views
5

निष्पादकों # newFixedThreadPool:फिक्स्ड थ्रेडपूल और कैश थ्रेडपूल बनाने के दौरान विभिन्न कतार का उपयोग क्यों करें?

public static ExecutorService newFixedThreadPool(int nThreads) { 
    return new ThreadPoolExecutor(nThreads, nThreads, 
            0L, TimeUnit.MILLISECONDS, 
            new LinkedBlockingQueue<Runnable>()); 
} 

निष्पादकों # newCachedThreadPool:

public static ExecutorService newCachedThreadPool() { 
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 
            60L, TimeUnit.SECONDS, 
            new SynchronousQueue<Runnable>()); 
} 

क्यों दो ThreadPool अलग कतार का उपयोग करें? मैंने जावा डॉक को LinkedBlockingQueue और SynchronousQueue के बारे में देखा है, लेकिन मुझे अभी भी पता नहीं है कि उनका उपयोग क्यों किया जाता है, प्रदर्शन पर विचार करना या दूसरों को?

+0

क्या यह एक डुप्लिकेट है? यह एक ही सवाल नहीं पूछता है। प्रतिक्रिया में कुछ सामान्य हो सकता है, लेकिन यह एक अलग सवाल है। –

+0

संबंधित एसई प्रश्न से कारण: सिंक्रोनस क्यूई एक बहुत ही विशेष प्रकार की कतार है - यह क्यूई के इंटरफ़ेस के पीछे एक मिलनसार दृष्टिकोण लागू करता है (उत्पादक उपभोक्ता तैयार होने तक निर्माता प्रतीक्षा करता है, उपभोक्ता प्रतीक्षा करता है)। –

उत्तर

0

जवाब वर्ग ThreadPoolExecutor के दस्तावेज में है:

  • रकम जुटा
    • किसी भी {@link BlockingQueue} हस्तांतरण और
    • प्रस्तुत कार्यों पकड़ करने के लिए इस्तेमाल किया जा सकता । इस कतार का उपयोग पूल आकार के साथ इंटरैक्ट करता है: * *
        * *
      • यदि कोरपूलसाइज थ्रेड से कम चल रहे हैं, तो निष्पादक * हमेशा क्यूइंग के बजाय एक नया धागा जोड़ना पसंद करता है।
      • * *
      • यदि कोरपूलसाइज या अधिक थ्रेड चल रहे हैं, निष्पादक * हमेशा नया * थ्रेड जोड़ने के बजाय अनुरोध को क्यूइंग करना पसंद करता है।
      • * *
      • यदि कोई अनुरोध कतारबद्ध नहीं किया जा सकता है, तो एक नया धागा तब तक बनाया जाता है जब तक कि यह अधिकतम पुलसाइज से अधिक न हो, में, यह कार्य * अस्वीकार कर दिया जाएगा।
      • * *
      * * क्यूइंग के लिए तीन सामान्य रणनीतियों हैं: * * *
    • डायरेक्ट हैंडऑफ। किसी काम के लिए एक अच्छा डिफ़ॉल्ट विकल्प * कतार {@ लिंक सिंक्रोनस क्यूयू} है जो * के बिना अन्यथा उन्हें पकड़ने के लिए कार्यों को हाथ से हटा देता है। यहां, कार्य को कतार करने का प्रयास * विफल हो जाएगा यदि कोई थ्रेड तुरंत चलाने के लिए उपलब्ध नहीं है, इसलिए * नया थ्रेड बनाया जाएगा। यह नीति लॉक अप से बचाती है जब * हैंडलिंग सेट अनुरोधों की आंतरिक निर्भरता हो सकती है। * डायरेक्ट हैंडऑफ को आम तौर पर नए सबमिट किए गए कार्यों को अस्वीकार करने से बचने के लिए असंबद्ध अधिकतमपूल आकार की आवश्यकता होती है। बदले में यह असंबद्ध थ्रेड वृद्धि की संभावना को स्वीकार करता है जब आदेश जारी रहता है * औसत पर संसाधित होने की तुलना में तेज़ी से पहुंचता है।
    • * *
    • असंबद्ध कतार।एक unbounded कतार का उपयोग (उदाहरण के लिए एक {@link LinkedBlockingQueue} पूर्वनिर्धारित * क्षमता के बिना) कतार में प्रतीक्षा करने के लिए नए कार्यों का कारण बनता है जब सभी * corePoolSize थ्रेड व्यस्त होते हैं। इस प्रकार, corePoolSize * धागे से कहीं अधिक नहीं बनाया जाएगा। (और maxPoolSize * का मान * इसलिए प्रभाव नहीं है।) यह उचित हो सकता है जब * प्रत्येक कार्य पूरी तरह से दूसरों से स्वतंत्र है, इसलिए कार्य * एक दूसरे को प्रभावित नहीं कर सकते हैं निष्पादन; उदाहरण के लिए, एक वेब पेज सर्वर में।* क्यूईंग की यह शैली अनुरोधों के क्षणिक विस्फोटों को चिकनाई करने में उपयोगी हो सकती है, यह * अनबॉल्ड वर्क कतार वृद्धि की संभावनाओं को स्वीकार करती है जब कमांड संसाधित होने की तुलना में औसत तेज़ी से पहुंचने के लिए जारी रहता है।
    • * *
    • बाध्य कतार। एक बाध्य कतार (उदाहरण के लिए, एक * {@link ArrayBlockingQueue}) संसाधन थकावट को रोकने में मदद करता है जब * अधिकतम अधिकतम PoolSizes के साथ उपयोग किया जाता है, लेकिन अधिक * ट्यून और नियंत्रण के लिए मुश्किल हो सकता है। कतार आकार और अधिकतम पूल आकार एक दूसरे के लिए * बंद हो सकते हैं: बड़ी कतारों और छोटे पूल का उपयोग * सीपीयू उपयोग, ओएस संसाधन, और संदर्भ-स्विचिंग ओवरहेड को कम करता है, लेकिन * कृत्रिम रूप से कम थ्रूपुट का कारण बन सकता है। यदि कार्य अक्सर ब्लॉक करते हैं (उदाहरण के लिए यदि वे I/O बाध्य हैं), तो सिस्टम अन्यथा अनुमति देने की तुलना में * अधिक थ्रेड के लिए समय निर्धारित करने में सक्षम हो सकता है। छोटी कतारों का उपयोग * आम तौर पर बड़े पूल आकार की आवश्यकता होती है, जो CPUs को व्यस्त रखता है लेकिन * अस्वीकार्य शेड्यूलिंग ओवरहेड का सामना कर सकता है, जो * थ्रूपुट भी कम करता है।

व्यवहार में कतार के पहले प्रकार तत्काल उपलब्ध धागे एक नया Runnable, दूसरे प्रकार यह धारण करता है, तो सभी धागे में व्यस्त हैं करने के लिए भेज देते हैं।

+0

दोनों एपीआईएस असंबद्ध कतार लौटते हैं। –

+0

@ravindra मेरा जवाब संशोधित –

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