मैं कार्यों को शेड्यूल करने के लिए ThreadPoolExecutor का उपयोग करने का प्रयास कर रहा हूं, लेकिन इसकी नीतियों के साथ कुछ समस्याओं में चल रहा हूं। यहां बताया गया है:ThreadPoolExecutor नीति
- यदि कोरपूलसाइज थ्रेड से कम चल रहे हैं, तो निष्पादक हमेशा कतार के बजाए एक नया धागा जोड़ना पसंद करता है।
- यदि कोरपूलसाइज या अधिक थ्रेड चल रहे हैं, तो निष्पादक हमेशा एक नया धागा जोड़ने के बजाय अनुरोध को क्यूइंग करना पसंद करता है।
- यदि कोई अनुरोध कतारबद्ध नहीं किया जा सकता है, तो एक नया धागा तब तक बनाया जाता है जब तक कि यह अधिकतम पुलसाइज से अधिक न हो, इस स्थिति में, कार्य को खारिज कर दिया जाएगा।
व्यवहार मैं चाहता हूँ यह है:
- एक ही जैसा कि ऊपर
- तो corePoolSize की तुलना में अधिक है, लेकिन maximumPoolSize धागे से कम चल रहे हैं, पसंद करते हैं कतार में एक नया थ्रेड जोड़ने, और एक निष्क्रिय धागा का उपयोग कर एक नया धागा जोड़ने पर।
- ही मैं किसी भी कार्य को अस्वीकार कर दिया जा नहीं करना चाहती ऊपर
मूल रूप से के रूप में; मैं चाहता हूं कि उन्हें एक असंबद्ध कतार में कतारबद्ध किया जाए। लेकिन मैं अधिकतम पुलसाइज थ्रेड तक रखना चाहता हूं। यदि मैं एक असंबद्ध कतार का उपयोग करता हूं, तो यह CoreSize हिट करने के बाद कभी थ्रेड उत्पन्न नहीं करता है। यदि मैं एक बाध्य कतार का उपयोग करता हूं, तो यह कार्यों को अस्वीकार करता है। क्या इसके आसपास कोई रास्ता है?
अब मैं जो सोच रहा हूं वह थ्रेडपूलएक्सएटर को सिंक्रोनस क्यूयू पर चला रहा है, लेकिन सीधे कार्यों को खिला नहीं रहा - बल्कि उन्हें एक अलग असंबद्ध लिंक्डब्लॉकिंग्यूयू में खिला रहा है। फिर एक और धागा LinkedBlockingQueue से निष्पादक में फ़ीड करता है, और यदि कोई खारिज हो जाता है, तो यह तब तक फिर से प्रयास करता है जब तक इसे खारिज नहीं किया जाता है। यह दर्द और एक हैक की तरह लगता है, हालांकि - क्या ऐसा करने का एक क्लीनर तरीका है?
ओह, मैंने जो लिखा वह बिल्कुल वैसा ही नहीं था जो मैं चाहता था। मैंने मूल संपादित किया। –
कोरपूलसाइज सेट करना = maxPoolSize वास्तव में करीब है, लेकिन मैं allowCoreThreadTimeOut (false) और prestartAllCoreThreads() को भी उपयोग कर रहा हूं। –