Java-使用ConcurrentLinkedDeque

时间:2018-12-13 18:06:38

标签: java multithreading concurrency thread-safety

构建多线程程序遇到了一个问题: ConcurrentLinkedDeque的remove方法被两个线程调用,并引发异常。我可以通过同步此方法的方式来解决问题,就像我在这段代码中所做的一样,但是我正在寻找不同步的解决方案。 我搜索了其他合适的结构,但是找不到任何不会引发异常的结构,或者等待队列再次填充。

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

    }
}     

我很好奇,还有另一种方法吗?

1 个答案:

答案 0 :(得分:3)

您可以改用poll。由于ConcurrentLinkedDeque不允许null元素,因此poll返回null意味着双端队列为空(在调用时)。

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