Java ArrayBlockingQueue.offer即使是TIMED_WAITING也会被阻止

时间:2016-12-06 14:55:07

标签: java multithreading

#26 prio=5 os_prio=0 tid=0x00007f3bc8396800 nid=0x5934 waiting on condition [0x00007f3bf0ef1000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x0000000726f2cc58> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
        at java.util.concurrent.ArrayBlockingQueue.offer(ArrayBlockingQueue.java:379)

这里使用方法提供(例如,超长时间,TimeUnit单位),超时为10秒,但它永远不会回来。有没有人知道这个或解决方案的原因是什么?

1 个答案:

答案 0 :(得分:0)

根据oracle docs&#34; offer(E e,long timeout,TimeUnit unit) 将指定的元素插入此队列的尾部,等待指定的等待时间,以便在队列已满时空间可用。&#34;

但是当队列变满时会出现问题。所以提供方法在那里无限等待。 有2种解决方法可以解决问题。 1.增加队列大小 2.调用poll()

在我的情况下,必须对具有此队列的对象执行清理,因此在不使用此队列之前无法执行清理。所以我调用了poll()方法来取消阻止offer(),然后可以毫无问题地清理。 增加队列大小也解决了问题,因为它从未达到完全状态。