簡體   English   中英

Java ArrayBlockingQueue.offer被阻止,即使它是TIMED_WAITING

[英]Java ArrayBlockingQueue.offer is getting blocked even it is TIMED_WAITING

#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)

這里使用方法offer(E e,長超時,TimeUnit單位),超時時間為10秒,但永遠不會回來。 有人知道這可能是什么原因或解決方案嗎?

根據oracle docs“ offer(E e,long timeout,TimeUnit unit)將指定的元素插入此隊列的末尾,直到隊列已滿,等待指定的等待時間以使空間可用。”

但是,當隊列已滿時就看到了問題。 因此報價方法在那里無限地等待着。 有2個解決方法可以解決此問題。 1.增加隊列大小2.調用poll()

在我的情況下,必須對具有此隊列的對象執行清除操作,直到不使用此隊列后才能執行清除操作。 因此,我調用了poll()方法來解除offer()的阻塞,然后可以進行清理而不會出現問題。 增大隊列大小也解決了該問題,因為它從未達到滿狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM