У меня есть многопоточное приложение, в котором есть один поток производителей и несколько потоков потребителей. Данные хранятся в общей потоковой безопасной коллекции и сбрасываются в базу данных, когда в буфере имеется достаточное количество данных.Буферизация данных в многопоточном приложении Java
Из Javadocs -
BlockingQueue<E>
очередь, что дополнительно поддерживает операции, которые ожидают очереди, чтобы стать непустыми при получении элемента, и ждать пространства, чтобы стать доступными в очереди при хранении элемента ,
take()
Извлекает и удаляет головку этой очереди, ожидая при необходимости, пока элемент не станет доступным.
Мои вопросы -
- Есть еще одна коллекция, которая имеет метод E [принимать] (Int N)? то есть блокировка очереди ожидает, пока элемент не будет доступен. Я хочу , что он должен подождать, пока не будет доступно 100 или 200 элементов.
- В качестве альтернативы, есть ли другой способ, который я мог бы использовать для решения проблемы без опроса?
Должны ли элементы распределяться поровну каждому потребителю, или если первый потребитель к методу принятия получает первые элементы 'n', второй потребитель - следующие элементы' n' и т. Д.? – SimonC
Это действительно то, что вы хотите сделать?Это может привести к почти произвольной большой задержке между производимыми данными и их сбросом в базу данных, если темпы производства будут замедляться за пределами того, что вы в конечном итоге настраиваете. Если вам действительно нужно сделать эту буферизацию, то ваша логика должна, вероятно, быть более похожей на «Подождите, пока у меня не будет элементов N или X ms» – DRMacIver
Почему вы хотите подождать? Почему бы просто не использовать 'drain()'? Я бы написал все имеющиеся у вас данные до некоторого максимума, и я бы предпочел не терять данные. –