5

मेरे पास एक एक्जिक्यूटर है जो ArrayBlockingQueue से संदेशों का उपभोग करने के लिए ज़िम्मेदार है।java.util.concurrent पर थ्रेड को पार्क करने का कारण क्या हो सकता है। थ्रेडपूलएक्ससेटर.get टास्क

new ThreadPoolExecutor(1, 1, 0L, 
       TimeUnit.MILLISECONDS, 
       new LinkedBlockingQueue<>(1), 
       r -> { 
        return new Thread(r, "Request-Queue-Drainer"); 
       }); 

अनुरोध-पंक्ति-Drainer धागा राज्य प्रतीक्षारत (कार्य इस सूत्र को प्रस्तुत किया जा रहा है हालांकि) में है। निम्नलिखित थ्रेड-डंप है।

Name: Request-Queue-Drainer 
State: WAITING on java.u[email protected]5b4757a2 
Total blocked: 0 Total waited: 8 

Stack trace: 
sun.misc.Unsafe.park(Native Method) 
java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
java.lang.Thread.run(Thread.java:745) 

धागे प्रतीक्षा स्थिति में होने का कारण क्या हो सकता है?

+0

आपका क्या मतलब है, "कतार से संदेशों को निकालने के लिए ज़िम्मेदार?" आप यहां एक बहुत ही सामान्य दिख रहे 'थ्रेडपूल एक्स्सेलर' का निर्माण कर रहे हैं। आप इसे एक स्पष्ट 'थ्रेड फैक्ट्री' पास करते हैं, लेकिन एकमात्र चीज आपकी 'थ्रेड फैक्ट्री' डिफ़ॉल्ट थ्रेड फैक्ट्री से अलग होती है, यह प्रत्येक नए धागे को एक विशेष नाम देती है। –

उत्तर

4

धागा इंतजार कर रहा है क्योंकि कतार खाली है। पूल धागे यही करते हैं: वे कतार से कार्य चुनते हैं और उन्हें चलाते हैं, और जब कतार खाली होती है, तो वे प्रतीक्षा करते हैं।


संपादित करें: वहाँ किसी और कि हो सकता है जब कतार खाली है कुछ: ThreadPoolExecutor कि मरने के लिए एक पूल धागा का कारण बनता है एक जहर की गोली संदेश में भेज सकते हैं श्रमिकों की संख्या की तुलना में अधिक से अधिक corePoolSize कर दिया गया है, तो keepAlive समय इकाइयों के लिए। यह आपके मामले में नहीं होगा हालांकि आप maximumPoolSize और corePoolSize को उसी नंबर (1) पर सेट करते हैं।


मैं अपने ThreadPoolExecutor एक सिवाय इसके कि तुम्हारा केवल एक ही लंबित कार्य हो सकता है Executors.newFixedThreadPool(1) से लौटा दिया जाएगा से अलग ढंग से किसी भी तरीके से व्यवहार करने की उम्मीद नहीं है, और यह पूल एक विशेष नाम थ्रेड देता है।

संबंधित मुद्दे