Где необходимо использовать Реализации BlockingQueue вместо Простых Реализаций Очереди?

Начиная с iOS 10 вы можете разработать расширение службы уведомлений для своего приложения. Он будет запущен системой, когда вы получите уведомление, и вы можете рассчитать действительный номер для значка и установить его.

Взгляните на документацию: https://developer.apple .com / документация / usernotifications / unnotificationserviceextension

23
задан Vaibhav Kamble 11 December 2008 в 10:55
поделиться

2 ответа

Ограниченная вместимость BlockingQueue также полезна, если Вы хотите отрегулировать своего рода запрос. С неограниченной очередью производители могут добраться далеко впереди потребителей. Задачи будут в конечном счете выполнены (если не будут так многие, что они вызывают OutOfMemoryError), но производитель, возможно, давно сдался, таким образом, усилие потрачено впустую.

В ситуациях как они, может быть лучше сигнализировать потенциальному производителю, которого очередь полна, и бросить быстро с отказом. Например, производитель мог бы быть веб-запросом с пользователем, который не хочет ожидать слишком долго, и даже при том, что он не использует много циклов ЦП при ожидании, он израсходовал ограниченные ресурсы как сокет и некоторая память. Отказ даст задачи, которые уже были поставлены в очередь лучший шанс закончиться своевременно.

<час>

Относительно исправленного вопроса, который я интерпретирую как, "Что такое хороший набор для содержания объектов в пуле?"

неограниченным LinkedBlockingQueue является хороший выбор для многих пулов. Однако в зависимости от Вашей стратегии управления пула, ConcurrentLinkedQueue может работать также.

В приложении объединения, "помещенное" блокирование не является соответствующим. Управление максимальным размером очереди является заданием пула manager— это решает, когда создать или уничтожить ресурсы для пула. Клиенты пула одалживают и возвращают ресурсы из пула. Добавление нового объекта или возврат ранее одолженного объекта к пулу должны быть быстрыми, не блокируя операции. Так, ограниченная полная очередь не является хорошим выбором для пулов.

, С другой стороны, при получении объекта от пула, большинство приложений хочет ожидать, пока ресурс не доступен. Операция "взятия", что блоки, по крайней мере временно, намного более эффективны, чем "активное ожидание" — неоднократно опрашивая, пока ресурс не доступен. Эти LinkedBlockingQueue хороший выбор в этом случае. Заемщик может заблокироваться неограниченно долго с [1 113] take или ограничить время, которое это готово заблокировать с [1 114] poll .

А менее общий падеж в том, когда клиент не готов заблокироваться вообще, но имеет способность создать ресурс для себя, если пул пуст. В этом случае, ConcurrentLinkedQueue хороший выбор. Это - вид серой области, где было бы хорошо совместно использовать ресурс (например, память) так же как возможный, но скорость еще более важна. В худшем случае это ухудшается к каждому потоку, имеющему его собственный экземпляр ресурса; затем было бы более эффективно не потрудиться пытаться совместно использовать среди потоков.

Оба из этих наборов дают хорошую производительность и простоту использования в параллельном приложении. Для непараллельных приложений, ArrayList твердо биться. Даже для наборов, которые растут динамично, издержки на элемент LinkedList позволяют ArrayList с некоторыми пустыми слотами оставаться конкурентоспособными мудрый памятью.

34
ответ дан erickson 29 November 2019 в 02:04
поделиться

Вы видели бы BlockingQueue в многопоточных ситуациях. Например, Вам нужна передача в BlockingQueue в качестве параметра для создания ThreadPoolExecutor , если Вы хотите создать одного конструктора использования. В зависимости от типа очереди Вы передаете в исполнителе, мог действовать по-другому.

3
ответ дан Eugene Yokota 29 November 2019 в 02:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: