gpt4 book ai didi

java - ConcurrentLinkedQueue 上的迭代器不会迭代到下一个值

转载 作者:行者123 更新时间:2023-12-02 12:04:56 24 4
gpt4 key购买 nike

我在迭代时更新ConcurrentLinkedQueue。理论上,该队列上的迭代器在到达队列末尾之前不应停止。但是,在我的程序中(如下所示),迭代器在迭代队列的初始状态(没有更新)后停止。我应该怎样解决这个问题?

public static void printTree(Node root) {
Queue<Node>q=new ConcurrentLinkedQueue<Node>();
q.add(root);

Iterator<Node> iter = q.iterator();
while(iter.hasNext()) {
List<Node> childs = iter.next().getChildren();
for(Node child:childs) {
q.add(child);
}
}

for (Node item:q) {
System.out.println(item.getValue());
}
}

它的输出是根的值(传递给函数的值)及其子项的值。它应该显示 child 的 child 的值(value)观,但事实并非如此。看起来迭代器 iter 只迭代 root ,它首先添加到队列中,而不是更多。

最佳答案

ConcurrentLinkedQueue#iterator()的javadoc中:

The returned iterator (...) guarantees to traverse elements as they existed upon construction of the iterator, and may (but is not guaranteed to) reflect any modifications subsequent to construction.

本质上,当您创建迭代器时,它将提供创建队列时的队列 View 。这是此 Collection 线程安全的原因之一:更改队列将并行完成,即不会影响现有迭代器。

在这种情况下不需要使用线程安全集合。您可以使用支持ListIterator的List。 ListIterator 是一个更强大的迭代器,它支持添加元素:

List<Node>q=new LinkedList<Node>();
q.add(root);

ListIterator<Node> iter = q.iterator();
while(iter.hasNext()) {
List<Node> childs = iter.next().getChildren();
for(Node child:childs) {
iter.add(child);
}
}

for (Node item:q) {
System.out.println(item.getValue());
}

这是该方法的替代实现,不使用迭代器,我更喜欢它:

List<String> q = new LinkedList<>();
q.add(root);

while(!q.isEmpty()) {
Node node = q.poll();
q.addAll(node.getChildren());
System.out.println(node.getValue());
}

关于java - ConcurrentLinkedQueue 上的迭代器不会迭代到下一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46958509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com