2012-09-10 21 views
21

यह मेरा कोड है:क्यों LinkedBlockingQueue # poll() लटका सकता है?

// in constructor 
BlockingQueue<Node> queue = new LinkedBlockingQueue<Node>(); 
// later in another thread 
Node node = queue.poll(1, TimeUnit.SECONDS); 

आमतौर पर यह काम करता है, लेकिन कभी कभी, कुछ परिस्थितियों में (अब भी कब और क्यों पता नहीं है) poll() विधि NULL वापस नहीं करता है लेकिन WAITING राज्य में अपने धागा हमेशा के लिए रहता है। क्यों और कैसे हो सकता है?

मैंने ArrayBlockingQueue - एक ही प्रभाव की कोशिश की। मैं मैक ओएस पर OpenJDK उपयोग कर रहा हूँ:

java version "1.7.0_05" 
Java(TM) SE Runtime Environment (build 1.7.0_05-b06) 
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode) 

एक ही कोड ओरेकल मैक ओएस पर जावा 1.6 के साथ बस ठीक काम करता है। यह जहां धागे फंस रहे है:

sun.misc.Unsafe.park(Native Method) 
java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) 
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834) 
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:894) 
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1221) 
java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:340) 
java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:462) 

दिलचस्प बात यह है कि जब मैं इस सूत्र interrupt() और poll() करने की कोशिश फिर से मैं तुरंत ही स्थिति तक पहुँचने है।

+3

यह संभवतः एक बग है, मैं ओपनजेडीके 7 या ओरेकल जावा 7 अपडेट 7 का नवीनतम संस्करण आज़माउंगा। क्योंकि यह सिस्टम कॉल का उपयोग करता है, मैं यह भी सुनिश्चित करता हूं कि आपके पास ओएस का एक समर्थित संस्करण है। –

+0

क्या आप 'वेटिंग' राज्य में धागे का एक स्टैकट्रैक दिखा सकते हैं? – axtavt

+0

क्या आप एक पुन: उत्पादित सरल प्रोग्राम लिख सकते हैं। –

उत्तर

3

यह एक [बुरा] मुद्दा है जिसे जावा 7 के शुरुआती संस्करणों में हल किया गया है। यदि आप नए जेवीएम में माइग्रेट करते हैं तो आपको उस समस्या नहीं होगी (ऐसा लगता है कि फिक्स को जावा 6 पर वापस नहीं भेजा गया है)।

here और here देखें।