Вопрос разработки Java BlockingQueue - PullRequest
4 голосов
/ 12 ноября 2010

JavaDoc метода java.util.concurrent.BlockingQueue.add (E e) читает:

логическое сложение (E e)

Вставляет указанный элемент в эта очередь, если это возможно сделать немедленно, не нарушая способности ограничения, возвращая истину на успех и бросать IllegalStateException, если нет пробела доступен на данный момент. При использовании очередь с ограниченной емкостью, это как правило, предпочтительнее использовать предложение.

Мой вопрос: вернется ли он когда-нибудь false? если нет, то почему этот метод возвращает логическое значение? Это кажется странным для меня. Какое дизайнерское решение стоит за этим?

Спасибо за ваши знания!
Manuel

Ответы [ 4 ]

5 голосов
/ 12 ноября 2010

Это следует за контрактом Collection.add(E e) (поскольку BlockingQueue является подтипом Collection):

Если коллекция отказывается добавить определенный элемент дляпо любой причине, кроме того, что он уже содержит элемент, он должен генерировать исключение (а не возвращать false).Это сохраняет инвариант, что коллекция всегда содержит указанный элемент после возврата этого вызова.

2 голосов
/ 12 ноября 2010

Решение позади: быстро провалиться.IllegalStateException будет выброшено, если очередь имеет ограниченную емкость.IllegalStateException является RuntimeException.Поэтому, если возникает исключение, возможно, у вас ошибка в логике приложения или логика приложения недостаточно защищена.Или, говоря другими словами: если вы хотите использовать ограниченную очередь, ваше приложение должно правильно с ней справиться (вместо этого используйте offer).

1 голос
/ 12 ноября 2010

Метод возвращает логическое значение, поскольку он переопределяет Collection#add(E e).

1 голос
/ 12 ноября 2010

Я предполагаю, что он имеет логический тип возврата, потому что это подинтерфейс Queue, который также имеет метод boolean add(E obj) (который в свою очередь является производным от Collection). Некоторые реализации Queue отклоняют попытки добавить объекты в очередь, возвращая false.

Таким образом, ответ на ваш вопрос заключается в том, что реализации BlockingQueue никогда не вернут false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...