यह मेरा कोड है:क्यों 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()
करने की कोशिश फिर से मैं तुरंत ही स्थिति तक पहुँचने है।
यह संभवतः एक बग है, मैं ओपनजेडीके 7 या ओरेकल जावा 7 अपडेट 7 का नवीनतम संस्करण आज़माउंगा। क्योंकि यह सिस्टम कॉल का उपयोग करता है, मैं यह भी सुनिश्चित करता हूं कि आपके पास ओएस का एक समर्थित संस्करण है। –
क्या आप 'वेटिंग' राज्य में धागे का एक स्टैकट्रैक दिखा सकते हैं? – axtavt
क्या आप एक पुन: उत्पादित सरल प्रोग्राम लिख सकते हैं। –