2012-09-10 10 views
21

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.

+3

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. –

+0

¿Puedes mostrar un stacktrace del hilo en estado 'WAITING'? – axtavt

+0

¿Puedes escribir un programa simple capaz de reproducir? –

Respuesta

3

Ese es un problema [desagradable] que se ha resuelto en las primeras versiones de Java 7. Si migra a la JVM más nueva, no tendrá ese problema (parece que la corrección no se ha retrotraído a Java 6)

Ver here y here.

Cuestiones relacionadas