Я в затруднении. У меня есть BlockingDequeBlockingDeque не разблокируется после того, как элемент вставлен в очередь
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 I, сериализую queue
. После запуска я де-сериализую очередь, и в этот момент queue.takeFirst()
извлекает элемент (тот же, который ранее не извлекал), и отправляет его.
У кого-нибудь есть идеи?
EDIT
Чтобы подчеркнуть свою точку немного больше. Если я изменил queue.takeFirst()
на queue.pollFirst()
и немного изменил код, чтобы игнорировать проходы, которые дают null
items
, тогда код работает так, как ожидалось.
Я могу себе представить, что (I), вы не добавляете в очереди или (б) вы не взяв из одной очереди или (iii) вы фактически забираете из очереди, но считаете, что это не так, или (iv) код, который принимает, никогда не выполняется ... – assylias
Как я уже сказал в своем редактировании, если я изменил код на pollFirst, тогда оно работает. Я уверен, что (i), (ii) не применяются. Для (iii) отладчик должен остановиться в точке останова, которую я поставил внутри try. Снова для (iv) код выполняется, если я останавливаю и запускаю код с сериализацией/десериализацией, которую я объяснил. – idipous
Без фрагмента кода, который воспроизводит вашу проблему, мы можем только догадываться ... Вы должны попытаться создать [mcve] (http://stackoverflow.com/help/mcve) – assylias