gpt4 book ai didi

Java 卡在 foreach 循环上

转载 作者:行者123 更新时间:2023-12-02 09:14:41 25 4
gpt4 key购买 nike

Java 在增加 foreach 循环时似乎挂起。我找不到任何人有类似的问题,所以也许我只是做错了什么,但我无法想象它是什么。我从 Neo4J 数据库中提取一组节点,然后迭代它。我在循环期间没有修改该组节点,但一段时间后,它会挂起。这是执行此操作的代码:

        IndexHits<Node> usrs = users.get("Type", "User");
System.out.println("Operating on "+usrs.size()+" Users:");

for (Node u : usrs) {
System.out.print(".");
if (inUserBlacklist(u))
continue;
System.out.println("HA");
}

inUserBlacklist(u) 所做的就是根据预设的节点集检查节点 u,以查看该节点是否属于黑名单。它不会改变 Node u 的任何内容。

Users 是一个 Neo4J 索引,因此对其调用 get() 应该返回一个可迭代的 IndexHits 对象。此 foreach 循环运行了 foreach 循环 269,938 次。在该迭代结束时,它打印“HA”,但随后它不再打印另一个“.”。它就在迭代 269,939 之前的那个点挂起。这使得它在 foreach 循环上阻塞。总迭代次数应为 270,012 次。

我注意到我的黑名单包含 74 个项目,在执行此循环时所有这些项目都应该匹配一次。 270,012 - 74 = 269,938,但这并不能解释为什么它会被阻塞。我所能想到的是,当我调用 continue 时,foreach 循环会增加迭代器上的位置,而不增加其计数器。然后它到达集合的末尾,没有更多内容,但计数器认为它只有 270,012 中的 269,938。

你们知道为什么 foreach 循环会这样吗?

编辑:堆栈跟踪显示该进程确实卡在 for 循环上(第 116 行):

   java.lang.Thread.State: RUNNABLE
at sun.nio.ch.FileDispatcher.pread0(Native Method)
at sun.nio.ch.FileDispatcher.pread(FileDispatcher.java:49)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:248)
at sun.nio.ch.IOUtil.read(IOUtil.java:224)
at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:663)
at org.neo4j.kernel.impl.nioneo.store.PersistenceRow.readPosition(PersistenceRow.java:91)
at org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.acquire(PersistenceWindowPool.java:177)
at org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.acquireWindow(CommonAbstractStore.java:559)
at org.neo4j.kernel.impl.nioneo.store.RelationshipStore.getChainRecord(RelationshipStore.java:349)
at org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.getMoreRelationships(ReadTransaction.java:121)
at org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.getMoreRelationships(ReadTransaction.java:104)
at org.neo4j.kernel.impl.persistence.PersistenceManager.getMoreRelationships(PersistenceManager.java:108)
at org.neo4j.kernel.impl.core.NodeManager.getMoreRelationships(NodeManager.java:666)
at org.neo4j.kernel.impl.core.NodeImpl.getMoreRelationships(NodeImpl.java:427)
- locked <0x77c9b4a0> (a org.neo4j.kernel.impl.core.NodeImpl)
at org.neo4j.kernel.impl.core.IntArrayIterator.fetchNextOrNull(IntArrayIterator.java:91)
at org.neo4j.kernel.impl.core.IntArrayIterator.fetchNextOrNull(IntArrayIterator.java:36)
at org.neo4j.helpers.collection.PrefetchingIterator.hasNext(PrefetchingIterator.java:55)
at org.neo4j.kernel.impl.traversal.TraversalBranchImpl.next(TraversalBranchImpl.java:128)
at org.neo4j.kernel.PreorderBreadthFirstSelector.next(PreorderBreadthFirstSelector.java:48)
at org.neo4j.kernel.impl.traversal.TraverserImpl$TraverserIterator.fetchNextOrNull(TraverserImpl.java:127)
at org.neo4j.kernel.impl.traversal.TraverserImpl$TraverserIterator.fetchNextOrNull(TraverserImpl.java:94)
at org.neo4j.helpers.collection.PrefetchingIterator.hasNext(PrefetchingIterator.java:55)
at org.neo4j.helpers.collection.IteratorWrapper.hasNext(IteratorWrapper.java:42)
at NodePlacement.LoadFromNode(NodePlacement.java:116)

所以...看起来线程仍在运行并且没有被任何东西阻塞。但它并没有脱离这部分代码。也许我的数据库设置已使其陷入无限循环?

最佳答案

当它挂起时,您可以从命令行使用 Ctrl-Break 或在调试器下运行时暂停执行,或者使用 jps 和 jstack 工具获取应用程序的线程转储并查看正在执行什么方法。

顺便说一句,所有 foreach 循环所做的都是从 Iterable 集合或数组中检索 Iterator 实例,并使用 Iterator 的 hasNext() 和 next() 方法。因此,如果这些方法中的任何一个挂起,您都会得到现在看到的内容。

关于Java 卡在 foreach 循环上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10555776/

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