为什么LinkedBlockingQueue#poll()可能挂断?

时间:2012-09-10 10:34:46

标签: java multithreading concurrency openjdk

这是我的代码:

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

通常它可以工作,但有时候,在某些情况下(仍然不知道何时和为什么)poll()方法不返回NULL但保持其线程永远处于WAITING状态。为什么以及如何发生这种情况?

我尝试ArrayBlockingQueue - 效果相同。我在Mac OS上使用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)

相同的代码适用于Mac OS上的Oracle Java 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()时,我会立即达到相同的状态。

1 个答案:

答案 0 :(得分:3)

这是一个已经在早期版本的Java 7中解决过的[讨厌]问题。如果你迁移到较新的JVM,你将不会遇到这个问题(似乎修复程序没有被反向移植到Java 6)

请参阅herehere