कैश्ड थ्रेड पूल को थ्रेड की संख्या तक सीमित करना असंभव लगता है जो इसे बना सकता है।
यहाँ बताया गया है कि स्थिर एक्ज़ीक्यूटर्स.newCachedThreadPool मानक जावा लाइब्रेरी में कैसे लागू किया जाता है:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
तो, एक निश्चित आकार के कैश्ड थ्रेड पूल बनाने के लिए उस टेम्पलेट का उपयोग करना:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
अब यदि आप इसका उपयोग करते हैं और 3 कार्य प्रस्तुत करते हैं, तो सब कुछ ठीक हो जाएगा। किसी भी अन्य कार्यों को प्रस्तुत करने से अस्वीकृत निष्पादन अपवाद होंगे।
यह कोशिश कर रहा है:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
क्रमिक रूप से निष्पादित सभी थ्रेड्स में परिणाम होगा। यानी, थ्रेड पूल आपके कार्यों को संभालने के लिए एक से अधिक थ्रेड कभी नहीं बनाएगा।
यह ThreadPoolExecutor की निष्पादित विधि में एक बग है? या शायद यह जानबूझकर है? या कोई और तरीका है?
संपादित करें: मैं वास्तव में कैश्ड थ्रेड पूल की तरह कुछ चाहता हूं (यह समय पर थ्रेड बनाता है और फिर कुछ समय के बाद उन्हें मारता है) लेकिन थ्रेड्स की संख्या पर एक सीमा के साथ इसे बना सकते हैं और एक बार इसके अतिरिक्त कार्यों को जारी रखने की क्षमता है इसकी धागा सीमा मारा। Sjlee की प्रतिक्रिया के अनुसार यह असंभव है। ThreadPoolExecutor की निष्पादित () पद्धति को देखते हुए यह वास्तव में असंभव है। मुझे ThreadPoolExecutor को ओवरक्लॉस करना होगा और कुछ हद तक SwingWorker जैसा होता है () को ओवरराइड करना होगा, लेकिन SwingWorker अपने एक्जीक्यूट में क्या करता है () एक पूरी हैक है।