yeg*_*256 21 java concurrency openjdk multithreading
这是我的代码:
// in constructor
BlockingQueue<Node> queue = new LinkedBlockingQueue<Node>();
// later in another thread
Node node = queue.poll(1, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)
通常它可以工作,但有时候,在某些情况下(仍然不知道何时和为什么)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)
Run Code Online (Sandbox Code Playgroud)
对于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)
Run Code Online (Sandbox Code Playgroud)
有趣的是,当我interrupt()这个线程并poll()再次尝试时,我立即达到相同的情况.
| 归档时间: |
|
| 查看次数: |
2902 次 |
| 最近记录: |