在调用remove()之前检查Queue是否还有什么

amp*_*ent 0 java queue multithreading thread-safety

ConcurrentLinkedQueue在一组线程处理它们之前使用a 来排队元素:

public class AsyncActionQueue implements Serializable {

    ...

    private Queue<QueuedAction> queue;

    public AsyncActionQueue() {

        this.queue = new ConcurrentLinkedQueue<>();
    }

    ...

    private class QueueProcessor implements Runnable {

        private boolean isKilled = false;

        public void run() {

            while(!isKilled) {
                QueuedAction action = queue.remove();
Run Code Online (Sandbox Code Playgroud)

queue.remove()如果队列中没有更多元素,我认为会返回null,而是我得到一个NoSuchElementException.

这是一种情况,其中队列是单例,并且可以使用弹性数量的线程来清空它.在尝试删除之前,线程检查队列中是否有元素的最佳方法是什么?我应该检查是否queue.size() > 0,这意味着线程安全吗?

Kay*_*man 6

您可以捕获异常或使用poll()哪个将返回为null空.

捕获a RuntimeException本身并不一定是"坏习惯",但在这种情况下,由于Queue包含两种需求的方法,因此它是不必要的.对于去除remove()抛出一个异常,poll()返回null,你必须插入add()offer()等.

在调用之前测试大小remove()也没有任何帮助,因为它不会是原子.大小可能会回来1,然后另一个线程可能已经删除它,并且这个线程remove()无论如何都会抛出异常.