Este es mi código:¿Por qué LinkedBlockingQueue # poll() puede colgar?
// in constructor
BlockingQueue<Node> queue = new LinkedBlockingQueue<Node>();
// later in another thread
Node node = queue.poll(1, TimeUnit.SECONDS);
Por lo general, funciona, pero a veces, en algunas circunstancias (todavía no saben cuándo y por qué) poll()
método no devuelve NULL
pero mantiene su rosca en WAITING
estado siempre. ¿Por qué y cómo esto podría pasar?
Probé ArrayBlockingQueue
- el mismo efecto. Estoy usando OpenJDK para Mac OS:
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)
El mismo código funciona bien con Oracle Java 1.6 en Mac OS. Aquí es donde están atrapados los hilos:
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)
Lo que es interesante es que cuando interrupt()
este hilo y trato de poll()
vez más llego a la misma situación de inmediato.
Probablemente sea un error, probaría la última versión de OpenJDK 7 u Oracle Java 7 update 7. Como esto utiliza una llamada al sistema, también me aseguraría de tener una versión compatible del sistema operativo. –
¿Puedes mostrar un stacktrace del hilo en estado 'WAITING'? – axtavt
¿Puedes escribir un programa simple capaz de reproducir? –