2016-03-20 11 views
5

मैं ThreadPoolExecutor नीचे के रूप में उपयोग कर रहा हूँ वापसी कथन के साथ एन कार्यों के बाद stucks:जावा 8 threadPoolExecutor

ThreadPoolExecutor pool = new ThreadPoolExecutor(cores, 50, 30L, 
TimeUnit.SECONDS, new ArrayBlockingQueue<>(10)); 

और:

pool.execute(()->{ 

//code goes here 

if(some condition){ 
    return; 
} 
//code goes here 
}) 

और जब वापसी कथन के साथ इस ब्लॉक सक्षम किया गया है, उन सभी कार्यों को हो जाता है टीपीई में फंस गया। टीपीई का कहना है कि यह पूरी तरह से लोड हो गया है और हमेशा RejectedExecutionException अपवाद

मुझे समझ में नहीं आता कि ऐसा क्यों होता है। उदाहरण के लिए यदि आपके पास आकार 10 का पूल है, और आपके पास 100 कार्य हैं, तो उनमें से 10 अनुभाग से मेल खाते हैं, आप 101 वें कार्य को स्वीकार नहीं करेंगे, सभी अगले कार्यों को खारिज कर दिया जाएगा। क्यूं कर?

+0

यह बताना मुश्किल है कि इस विवरण से क्या गलत हुआ ... सबमिट किए गए कार्यों में से कोई भी निष्पादित किया गया था? शायद आपके कार्यों के कोड में कुछ प्रकार की बग है और वे सरल रुक गए हैं ... – nukie

+0

असल में आप 11 वें कार्य को स्वीकार नहीं करेंगे क्योंकि कतार 10 आकार का है – Antoniossss

उत्तर

5

आप ठीक से कॉन्फ़िगर नहीं किया अपने ThreadPoolExecutor

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

दिया प्रारंभिक मापदंडों और डिफ़ॉल्ट धागा कारखाने के साथ एक नया ThreadPoolExecutor बनाता है और निष्पादन हैंडलर को अस्वीकार कर दिया। इस सामान्य उद्देश्य कन्स्ट्रक्टर के बजाय एक्जिक्यूटर्स फैक्ट्री विधियों में से एक का उपयोग करना अधिक सुविधाजनक हो सकता है।

पैरामीटर:

corePoolSize - धागे की संख्या पूल में रखने के लिए, भले ही वे निष्क्रिय हैं, जब तक कि allowCoreThreadTimeOut

maximumPoolSize सेट है - धागे की अधिकतम संख्या पूल में अनुमति देने के लिए

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

unit - कतार कार्यों पकड़े इससे पहले कि वे क्रियान्वित कर रहे हैं के लिए उपयोग करने के लिए - KeepAliveTime तर्क

workQueue के लिए समय इकाई। इस कतार में निष्पादन विधि द्वारा सबमिट किए गए केवल चलने योग्य कार्य होंगे।

मैंने कभी भी workQueue आकार (10) maximumPoolSize (50) से कम टीपीई नहीं देखा है। आपकी वर्तमान कॉन्फ़िगरेशन के साथ, 11 वें कार्यकर्ता कार्य को 10 के कतार आकार (उस बिंदु पर कतार का आकार)

RejectedExecutionException से छुटकारा पाने के लिए अपने workQueue आकार को बढ़ाएं। 50 धागे आसानी से 1000 से अधिक छोटे कार्यकर्ता कार्यों को संभाल सकते हैं। उचित मूल्य के साथ आपकी आवश्यकता के आधार पर इस कतार आकार को कॉन्फ़िगर करें।