#java #queue #blockingqueue #capacity
#java #очередь #blockingqueue #емкость
Вопрос:
Я пишу небольшое приложение, и я хочу иметь ограниченную очередь. Наивный подход заключался бы в том, чтобы сделать это:
Queue<Integer> queue = new ArrayDeque<> (5);
Проблема в том, что я получаю начальную емкость (размер которой изменяется), а не максимальную емкость. Документ для этого конструктора:
* Constructs an empty array deque with an initial capacity * sufficient to hold the specified number of elements.
Затем я сделал BlockingQueue
то, что, как я знаю, является «блокирующим» и будет соответствовать заданию, которое я закодировал:
BlockingQueue<Integer> queue = new ArrayBlockingQueue<> (5);
Я знаю, что это сработает, так как теперь я получаю ограниченную очередь. Документ для этого конструктора:
* Creates an {@code ArrayBlockingQueue} with the given (fixed)
* capacity and default access policy.
Я думал, что работа завершена, но я вспомнил, что реализации BlockingQueue потокобезопасны. И мое приложение использует один поток. Таким образом, я не хочу иметь «снижение производительности».
Теперь я немного застрял. Я хочу использовать BlockingQueue's
bounded constructor, но я не хочу, чтобы его синхронизированная перегрузка. Что может быть лучшим решением для этого сценария? И почему нам не предоставляется «обычная» очередь с границами?
Ответ №1:
Однопоточная реализация ограниченной очереди не предоставляется JDK, вероятно, потому, что не существует универсального алгоритма, способного поддерживать все варианты использования. Например, что вы хотите, чтобы произошло, когда очередь заполнена? Следует ли отбрасывать входящие элементы, последний или первый?
Реализация ваших собственных в соответствии с вашими потребностями должна быть тривиальной.