for循环获取队列ConcurrentLinkedQueue中的元素,为什么只能取到一半的值,求解

public class T04_ConcurrentQueue {

static ConcurrentLinkedQueue queue = new new ConcurrentLinkedQueue<>();

static {
    for(int i = 0; i < 100; i++){
        queue.offer(i);
    }
}

public static void main(String[] args) {

    for(int i = 0; i < queue.size(); i++){
        System.out.println(queue.poll())
    }

}

}

因为你每次取,queue.size都在不断变小啊。。。你去50次的时候,size刚好到50,就结束了,你改成这样就好了:

    public static void main(String[] args) {
        int size = queue.size();
        for(int i = 0; i < size; i++){
            System.out.println(queue.poll());
        }
    }

你在不断的往外弹元素,queue的size也在变小

这种队列取size慢啊 你可以用他里面的方法判断队列里面有没有值 用 while循环

首先我们得理解一点,queen.poll执行后的影响:取出队列头上第一个元素、队列长度减1。理解这个后,问题就很简单了。

再说你的代码,显然你是想把queen所有元素都删除并打印出来,那么循环终止条件就是队列不是空(长度不是0)
在你的代码中,每次循环后,队列长度N减少了1,而每次循环i进行+1,所以i什么时候会追上队列长度呢? N/2次循环后(N为奇数、偶数可能不太一样了,自己试吧)。

示例,参考下面的代码,把queen所有元素都删除并打印出来

public class T04_ConcurrentQueue {
    static ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>();

    static {
        for (int i = 0; i < 100; i++) {
            queue.offer(i);
        }
    }

    public static void main(String[] args) {
        while (queue.size() > 0) { 
            System.out.println(queue.poll());
        }
    }
}

当然,如果你只是要循环一边queen,那么不要使用poll,
示例,遍历队列

public class T04_ConcurrentQueue {
    static ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>();

    static {
        for (int i = 0; i < 100; i++) {
            queue.offer(i);
        }
    }

    public static void main(String[] args) {
        Iterator iterator = queue.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

用queue.isEmpty()判断比queue.size()判断性能好很多,也不会出错