Существует ли существующая реализация FilteringBlockingQueue в «общепринятой» библиотеке (Jakarta Commons, Guava, Spring, ...?) - PullRequest
0 голосов
/ 13 июня 2019

В jdk есть PriorityBlockingQueue, который может сортировать элементы с помощью (предоставляемого или используемого по умолчанию) компаратора.

Теперь мне нужен FilteringBlockingQueue, это параллельная очередь, которая предлагает в данный момент времени только подмножество элементов на основе динамического фильтра и для которой операция poll не удаляет элемент, а изменяет его состояние.

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

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

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

Такая вещь уже существует в «стандартной» библиотеке (и имеет ли она известное имя)?

edit: Я нашел похожий запрос здесь: Реализация списка блокировки Java , но без какого-либо принятого ответа ...

1 Ответ

1 голос
/ 14 июня 2019

Вопрос аналогичен запросу FilteringStack: если разные пользователи структуры данных, используя разные фильтры, видят радикально различное поведение (например, каждый из них видит разную вершину стека)Это действительно Stack?Классические структуры данных (и их параллельные версии) имеют четко определенную семантику и хорошо известные оптимальные реализации.Если вы измените семантику, эти реализации больше не будут работать.

Если вам нужно изменить порядок и фильтры во время выполнения и для потока, безопасным для потока способом, я бы рекомендовал использоватьбаза данных памяти, такая как HSQLDB, H2 или Derby.Вы также можете избежать накладных расходов при отображении объектов в реляционные форматы и наоборот, используя вместо этого objectdb.

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

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