Мне нужно реализовать потребителя, который берет элементы из очереди в определенном размере пакета. Однако не следует долго ждать накопления элементов до тех пор, пока в очереди не появится размер пакета в количестве элементов. Это должно быть либо количество элементов в размере пакета, если оно присутствует в очереди, либо ожидание определенного количества времени, и сколько бы ни было накоплено элементов, оно должно отправить их и вернуться и опросить снова.
Ожидание до этого порогового времени я должен вызывать poll для каждого из элементов и проверять, истекло ли время. (Реализация1) Или я должен реализовать несколько вызовов callToT, пока оно не достигнет порогового времени (Реализация2)? Или есть какой-нибудь другой эффективный способ сделать это?
Реализация 1
long waitTimeNanos = unit.toNanos(waitTime);
long startTime = System.nanoTime();
long timeRemaining = waitTimeNanos;
// Always block if queue is empty first time
Element firstElement = queue.take();
List<Element> list = new ArrayList<>(maxElements);
list.add(firstElement);
int count = 1;
while(count < maxElements && timeRemaining > 0) {
Element nextElement = queue.poll(timeRemaining, TimeUnit.NANOSECONDS);
if(nextElement != null) {
list.add(nextElement);
timeRemaining = waitTime - (System.nanoTime() - startTime);
}
}
return list;
Реализация 2
long waitTimeNanos = unit.toNanos(waitTime);
long startTime = System.nanoTime();
long timeRemaining = waitTimeNanos;
// Always block if queue is empty first time
Element firstElement = queue.take();
List<Element> list = new ArrayList<>(maxElements);
list.add(firstElement);
int count = 1;
int remainingBatchSize = maxElements - 1;
while(remainingBatchSize > 0 && timeRemaining > 0) {
// Will add in bulck if element
int drainedSize = queue.drainTo(list, remainingBatchSize);
remainingBatchSize -= drainedSize;
timeRemaining = waitTime - (System.nanoTime() - startTime);
}
return list;