मैं JDK6 साथ ThreadPoolExecutor का उपयोग कर धागा पूलिंग के लिए विभिन्न रणनीतियों के साथ चारों ओर खिलवाड़ किया गया है। मेरे पास प्राथमिकता कतार काम कर रही है लेकिन मुझे यकीन नहीं था कि अगर मुझे एलीवटाइम (जो आपको एक असंबद्ध कतार के साथ मिलता है) के बाद पूल का आकार नहीं था। तो, मैं एक LinkedBlockingQueue और CallerRuns नीति का उपयोग कर ThreadPoolExecutor पर देख रहा हूं।KeepAliveTime के बाद ThreadPoolExecutor CorePoolSize के नीचे धागे को कम क्यों करता है?
मेरे साथ अब समस्या यह है कि पूल रैंप ऊपर है, क्योंकि दस्तावेज़ों को यह समझाया जाता है कि यह चाहिए, लेकिन कार्यों के पूरा होने के बाद और KeepAliveTime खेलने में आता है PoolSize पूल को शून्य से कम कर देता है। नीचे दिए गए उदाहरण कोड आप मेरे सवाल के लिए आधार देखते हैं चाहिए:
public class ThreadPoolingDemo {
private final static Logger LOGGER =
Logger.getLogger(ThreadPoolingDemo.class.getName());
public static void main(String[] args) throws Exception {
LOGGER.info("MAIN THREAD:starting");
runCallerTestPlain();
}
private static void runCallerTestPlain() throws InterruptedException {
//10 core threads,
//50 max pool size,
//100 tasks in queue,
//at max pool and full queue - caller runs task
ThreadPoolExecutor tpe = new ThreadPoolExecutor(10, 50,
5L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(100),
new ThreadPoolExecutor.CallerRunsPolicy());
//dump 5000 tasks on the queue
for (int i = 0; i < 5000; i++) {
tpe.submit(new Runnable() {
@Override
public void run() {
//just to eat some time and give a little feedback
for (int j = 0; j < 20; j++) {
LOGGER.info("First-batch Task, looping:" + j + "["
+ Thread.currentThread().getId() + "]");
}
}
}, null);
}
LOGGER.info("MAIN THREAD:!!Done queueing!!");
//check tpe statistics forever
while (true) {
LOGGER.info("Active count: " + tpe.getActiveCount() + " Pool size: "
+ tpe.getPoolSize() + " Largest Pool: " + tpe.getLargestPoolSize());
Thread.sleep(1000);
}
}
}
मैं एक पुराने बग कि इस मुद्दे को हो रहा है पाया, लेकिन यह बंद हो गया: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6458662। क्या यह अभी भी 1.6 में मौजूद हो सकता है या क्या मुझे कुछ याद आ रहा है?
ऐसा लगता है कि मैं रबड़ की तरह इस एक (http://www.codinghorror.com/blog/2012/03/rubber-duck-problem-solving.html) ducked। ऊपर से जुड़ी बग इस से संबंधित है: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6576792, जहां समस्या 1.7 में हल हो रही है (मैंने 1.7 लोड किया और सत्यापित - तय ...)। मुझे लगता है कि मेरी मुख्य समस्या यह थी कि इस मूलभूत बग लगभग एक दशक तक बना रहा। मैंने इसे पोस्ट करने के लिए इसे लिखने में बहुत अधिक समय बिताया, उम्मीद है कि यह किसी की मदद करेगी।
+1 अच्छा खोज, इस व्यवहार को देखने के लिए खुद को हैरान था। –
शायद आपकी पोस्ट को एक प्रश्न के रूप में व्यवस्थित करना बेहतर होगा और फिर उत्तर के रूप में आपने जो सीखा है उसे प्रदान करें? –