मैं एक समाधान को कोड करने की कोशिश कर रहा हूं जिसमें एक एकल धागा I / O- गहन कार्यों का उत्पादन करता है जो समानांतर में किया जा सकता है। प्रत्येक कार्य में महत्वपूर्ण मेमोरी डेटा होता है। इसलिए मैं उन कार्यों को सीमित करना चाहता हूं जो एक पल में लंबित हैं।
अगर मैं इस तरह ThreadPoolExecutor बनाऊं:
ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(maxQueue));
फिर executor.submit(callable)
फेंकता है RejectedExecutionException
जब कतार भर जाती है और सभी धागे पहले से ही व्यस्त होते हैं।
बनाने के लिए मैं क्या कर सकता हूं executor.submit(callable)
जब कतार भरी हो और सभी धागे व्यस्त हों ब्लॉक ?
संपादित करें : मैंने यह कोशिश की :
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
और यह कुछ हद तक उस प्रभाव को प्राप्त करता है जो मैं प्राप्त करना चाहता हूं, लेकिन एक अयोग्य तरीके से (मूल रूप से खारिज किए गए धागे कॉलिंग थ्रेड में चलाए जाते हैं, इसलिए यह कॉलिंग थ्रेड को अधिक सबमिट करने से रोकता है)।
EDIT: (प्रश्न पूछने के 5 साल बाद)
इस प्रश्न और इसके उत्तर को पढ़ने वाले किसी व्यक्ति के लिए, कृपया एक सही समाधान के रूप में स्वीकृत उत्तर को न लें। कृपया सभी उत्तर और टिप्पणियों के माध्यम से पढ़ें।