Java - исключение NonSuchElementException с использованием ConcurrentLinkedDeque - PullRequest
0 голосов
/ 13 декабря 2018

Сборка многопоточной программы Я столкнулся с проблемой: метод удаления ConcurrentLinkedDeque был вызван двумя потоками и вызвал исключение.Я могу решить проблему, синхронизировав этот метод, как я делал в этом коде, но я ищу решение без синхронизации.Я искал другие подходящие структуры, но не нашел ни одной, которая не выдает исключение или не ждет повторного заполнения очереди.

    public void releaseVehicle(DeliveryVehicle vehicle) {
    acquireTable.put(vehicle.getLicense(), true);
    synchronized (futureQueue) {
        if (!futureQueue.isEmpty())
            futureQueue.remove().resolve(vehicle);    

    }
}     

Мне любопытно, есть ли другой способ?

1 Ответ

0 голосов
/ 13 декабря 2018

Вместо этого вы можете использовать poll.Поскольку ConcurrentLinkedDeque не допускает null элементов, poll возврат null означает, что deque пуст (на момент вызова).

SomeClass element;
while ((element = deque.poll()) != null) {
    // do something with element
}
...