Java - 使用 ConcurrentLinkedDeque 避免 NonSuchElementException

标签 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);    

    }
}     

我很好奇,还有别的办法吗?

最佳答案

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

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

关于Java - 使用 ConcurrentLinkedDeque 避免 NonSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53767756/

相关文章:

python - 如何在 Python 中同时运行 2 个服务器?

java - 仅从 Android N (--min-api 24) : void butterknife. Unbinder.lambda$static$0() 开始支持静态接口(interface)方法

java - 使用方法提供参数

multithreading - 如何按需启动/停止监视Delphi线程?

multithreading - `vkCommandPool` 可以从主线程分配并移动到其他线程吗?

java - 如果可以使用 synchronized(this),为什么还要使用 ReentrantLock?

Java String.intern() 使用 HashTable 而不是 ConcurrentHashMap

python - 为什么我们需要 gevent.queue?

java - 为什么 Kotlin 集合的运行时类是 Java 类?

java - 在 Netbeans 7.3.1 上运行 Struts 2 应用程序时出现无操作映射错误