Я использую ThreadPoolTaskExecutor (весны), чтобы выполнить некоторые задачи асинхронно.очередь пула потоков с уникальными задачами
Необходимая задача будет загружать некоторый объект из внешней БД в мою системную память. Я использую максимальный размер пула потоков 10 и максимальный размер очереди 100.
Предположим, что все 10 потоков заняты получением объектов из моей БД и задача создана, она перейдет в очередь. Теперь создается еще одна задача, которая должна получить тот же объект (тот же ключ в БД) из БД, он также перейдет в очередь (при условии, что все 10 потоков все еще заняты).
Таким образом, моя очередь может быть полностью заполнена дублированными задачами, которые будут выполняться по очереди, и я не хочу, чтобы это произошло.
Я думал, что решение должно прийти в виде уникальной коллекции, которая служит очереди пула потоков. Под капотом ThreadPoolTaskExecutor использует LinkedBlockingQueue, который не обеспечивает уникальности.
Я подумал о нескольких возможных решений, но ни один не удовлетворяет меня:
- Использование ThreadPoolExecutor вместо ThreadPoolTaskExecutor. ThreadPoolExecutor предоставляет конструктор, который позволяет мне определять тип очереди пула потоков, но ему необходимо реализовать интерфейс BlockingQueue. Я не смог найти реализацию, которая сохранит уникальность.
Это привело меня, чтобы попытаться расширить LinkedBlockingQueue и переопределить добавить:
public boolean add(E e)
if(!this.contains(e)) {
return super.add(e);
} else {
return false;
}
}
Но, насколько я могу сказать, что это приведет к значительному снижению производительности, так как метод contains
ограничен О (п) - плохая идея.
Что может решить моя проблема? Я нацелен на хорошую производительность (в случае компрометации производительности памяти я не против отказаться от производительности памяти).
Я уже думал об использовании обходного пути, который более или менее похож на ваше предложение (применяя уникальность с использованием дополнительного набора). Если я не получу лучшего ответа в ближайшие дни, я приму ваше. – forhas
, пожалуйста, дайте мне знать, если вы придете к лучшему решению в ближайшие дни. –
Я определенно буду, спасибо. – forhas