Реализация очереди с заблокированным 'take ()', но с политикой исключения - PullRequest
3 голосов
/ 07 мая 2010

Есть ли реализация с блокирующей очередью для взятия, но ограниченной максимальным размером. Когда размер очереди достигает заданного максимального размера, вместо блокировки «put» он удаляет элемент head и вставляет его. Так что put не заблокирован (), а take () есть.

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

Примером этого может служить система торговли акциями. Когда вы получаете скачок в данных о сделках / котировках акций, если вы не использовали данные, вы хотите автоматически отбрасывать старые сделки / котировки акций.

Ответы [ 2 ]

1 голос
/ 07 мая 2010

В настоящее время в Java нет поточно-ориентированной очереди, которая будет выполнять то, что вы ищете. Тем не менее, существует BlockingDequeue (Double Ended Queue), в котором вы можете написать оболочку, в которой вы можете взять из головы и хвоста, как вы видите свободно.

Этот класс, похожий на BlockingQueue, является потокобезопасным.

1 голос
/ 07 мая 2010

В ThreadPoolExecutor предусмотрено несколько стратегий. Ищите «AbortPolicy» в этом javadoc . Вы также можете реализовать свою собственную политику, если хотите. Возможно Discard похоже на то, что вы хотите. Лично я думаю, что CallerRuns - это то, что вы хотите в большинстве случаев.

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

РЕДАКТИРОВАТЬ: (некоторые пояснения ..) «Исполнитель» - это, по сути, пул потоков, объединенный с очередью блокировки. Это рекомендуемый способ реализации шаблона производитель / потребитель в Java. Авторы этих библиотек предлагают несколько стратегий для решения таких проблем, как вы упомянули. Если вам интересно, здесь - это другой подход, специально предназначенный для решения проблемы OOME (источник зависит от фреймворка и не может использоваться как есть).

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