foreach ループをインクリメントすると、Java がハングしているように見えます。私は同じような問題を抱えている人を見つけることができないので、何か間違ったことをしているのかもしれませんが、それが何であるか想像できません. 私は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 をチェックして、ノードがブラックリストの一部であるかどうかを確認することだけです。ノード u については何も変更しません。
ユーザーは Neo4J インデックスであるため、get() を呼び出すと反復可能な IndexHits オブジェクトが返されます。この foreach ループは、foreach ループを 269,938 回実行します。その反復の最後に、「HA」を出力しますが、別の「.」を出力することはありません。反復 269,939 の直前で、その時点でハングします。これにより、foreach ループでブロックされます。合計 270,012 回の反復があるはずです。
ブラックリストには 74 個のアイテムが含まれていることに気付きました。これらはすべて、このループを通過する間に 1 回一致する必要があります。270,012 - 74 = 269,938 ですが、これではブロックされている理由を説明できません。私が把握できるのは、foreach ループが、continue を呼び出したときにカウンターをインクリメントせずにイテレータの位置をインクリメントしていることだけです。その後、セットの最後に到達し、それ以上はありませんが、カウンターは 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)
そのため...スレッドはまだ実行されており、何もブロックされていないようです。それでも、コードのこのセクションから抜け出すことはできません。データベースのセットアップに関する何かが原因で、データベースが無限ループに陥ったのではないでしょうか?