बनाने के लिए मुझे जावा (java.util.concurrent) में थ्रेड पूल को कार्यान्वित करने की आवश्यकता है, जिनकी संख्या कमजोर होने पर धागे की संख्या कम होती है, लेकिन ऊपरी बाउंड तक बढ़ती है (लेकिन कभी नहीं आगे) जब नौकरियों को निष्पादित करने की तुलना में तेज़ी से जमा किया जाता है, और जब सभी नौकरियां पूरी की जाती हैं तो निचली सीमा तक वापस आती है और कोई और नौकरियां जमा नहीं की जाती हैं।गतिशील (बढ़ते/घटते) थ्रेड पूल
आप इस तरह कुछ कैसे लागू करेंगे? मुझे कल्पना है कि यह काफी आम उपयोग परिदृश्य होगा, लेकिन स्पष्ट रूप से java.util.concurrent.Executors
फैक्ट्री विधियां केवल निश्चित आकार के पूल और पूल बना सकती हैं जो कई नौकरियां जमा होने पर असंबद्ध रूप से बढ़ती हैं। ThreadPoolExecutor
कक्षा corePoolSize
और maximumPoolSize
पैरामीटर प्रदान करती है, लेकिन इसके प्रलेखन का अर्थ यह है कि एक ही समय में corePoolSize
धागे से अधिक होने का एकमात्र तरीका एक बाध्य नौकरी कतार का उपयोग करना है, इस मामले में, यदि आप maximumPoolSize
धागे तक पहुंच गए हैं, आपको नौकरी के रिजेक्शन मिलेगा जिन्हें आपको अपने साथ सौदा करना है? मैं इसके साथ आया:
//pool creation
ExecutorService pool = new ThreadPoolExecutor(minSize, maxSize, 500, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(minSize));
...
//submitting jobs
for (Runnable job : ...) {
while (true) {
try {
pool.submit(job);
System.out.println("Job " + job + ": submitted");
break;
} catch (RejectedExecutionException e) {
// maxSize jobs executing concurrently atm.; re-submit new job after short wait
System.out.println("Job " + job + ": rejected...");
try {
Thread.sleep(300);
} catch (InterruptedException e1) {
}
}
}
}
क्या मैं कुछ दिख रहा हूं? क्या ऐसा करने के लिए इससे अच्छा तरीका है? इसके अलावा, किसी की आवश्यकताओं के आधार पर, यह समस्याग्रस्त हो सकता है कि उपर्युक्त कोड कम से कम समाप्त नहीं होगा (मुझे लगता है) (total number of jobs) - maxSize
नौकरियां समाप्त हो गई हैं। तो यदि आप पूल में मनमाने ढंग से नौकरियों को जमा करने में सक्षम होना चाहते हैं और उनमें से किसी के लिए इंतजार किए बिना तुरंत आगे बढ़ना चाहते हैं, तो मैं नहीं देखता कि आप समर्पित "नौकरी जमा करने" धागे के बिना ऐसा कैसे कर सकते हैं सभी जमा नौकरियों को रखने के लिए आवश्यक असंबद्ध कतार। AFAICS, यदि आप ThreadPoolExecutor के लिए एक असंबद्ध कतार का उपयोग कर रहे हैं, तो इसकी थ्रेड गिनती कोरपूलसाइज से आगे नहीं बढ़ेगी।
मुझे स्वीकार करना है, मैं एक गतिशील आकार के थ्रेडपूल की उपयोगिता को देखने में विफल रहता हूं। क्या आपके बोर्ड के प्रोसेसर आपके बोर्ड के अपटाइम के दौरान बदलते हैं? – corsiKa
आपकी स्थिति के लिए 'newCachedTreadPool' उपयुक्त क्यों नहीं है? यह स्वचालित रूप से उन धागे को मार देता है जिनका उपयोग अब नहीं किया जाता है। – Tudor
यदि आपके निष्क्रिय धागे मर नहीं गए तो क्या होगा? मान लें कि आपके पास अधिकतम आकार का एक निश्चित आकार पूल था? क्या हुआ होगा? –