我很茫然。我有一個BlockingDeque項目插入隊列後,BlockingDeque不會取消阻止
private class Consumer extends Thread {
@Override
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
if (connection.isReady()) {
final Item item = queue.takeFirst();
try {
ListenableFuture<Result> listenableFuture = connection.submitItem(item);
Futures.addCallback(listenableFuture, new FutureCallBackImpl<Result>(item));
} catch (RejectedExecutionException e) {
LOGGER.debug("Slow down submission of tasks we have a queue full in connection");
queue.addFirst(item);
}
}
}
} catch (InterruptedException e) {
LOGGER.debug("Interrupted. I will not propagate up because I own this thread");
}
}
}
此代碼通常阻止在queue.takeFirst()
當沒有項目在隊列中。但是,一旦按預期添加項目,它不會解除阻止。在調試過程中,我可以看到queue
中的項目以及當我停止Tomcat時序列化queue
。在開始之後,我將隊列反序列化,然後queue.takeFirst()
檢索該項目(與之前未檢索到的項目相同)並提交。
有沒有人有任何想法?
編輯
要強調我的觀點多一點。如果我將queue.takeFirst()
更改爲queue.pollFirst()
並略微調整代碼以忽略產生null
items
的代碼,則代碼將按預期工作。
我可以想像,(i)您沒有添加到隊列或(ii)你是不是從同一隊列中取出或(iii)您實際上正在從隊列中取出,但認爲您不是或(iv)所需的代碼永遠不會執行...... – assylias
正如我在編輯中所說的,如果我將代碼更改爲pollFirst有用。我相信(i),(ii)不適用。對於(iii)調試器應停在我放入try的斷點處。 (iv)如果我停止並通過序列化/反序列化來啓動代碼,則代碼被執行我解釋了 – idipous
沒有一段代碼來重現您的問題,我們只能猜測......您應該嘗試創建一個[mcve] (http://stackoverflow.com/help/mcve) – assylias