Java LinkedBlockingQueue sinkTo () против вызова poll () несколько раз - PullRequest
0 голосов
/ 06 марта 2020

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

Ожидание до этого порогового времени я должен вызывать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...