2012-09-10 13 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を試しました - 同じ効果。私は、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()しようとしたとき、私はすぐに同じような状況に達するということです:スレッドが立ち往生しているところです。

+3

これはおそらくバグです。私はOpenJDK 7またはOracle Java 7の最新バージョンを試してみます。これはシステムコールを使用するため、サポートされているバージョンのOSがあることを確認します。 –

+0

スレッドのスタックトレースを「待ち」状態で表示できますか? – axtavt

+0

再生可能なシンプルなプログラムを書くことができますか? –

答えて

3

Java 7の初期のバージョンで解決された問題です。新しいJVMに移行すると、その問題は発生しません(修正がJava 6にバックポートされていないようです) )。

hereおよびhereを参照してください。

関連する問題