0

私は更新システムを持っているmultiythreading:にConcurrentModificationException -

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      while (true) { 
       try { 
        Main.frame.onUpdate(); 
        Thread.sleep(50); 
        for (Entity e : Main.frame.getEntityHandler().getEntities()) { 
         e.onUpdate(); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }).start(); 

、時にはそれがConcurrentModificationExceptionを与えます。なぜこうなった?例外:

java.util.ConcurrentModificationException 
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) 
at java.util.ArrayList$Itr.next(ArrayList.java:851) 
at de.crade.ki.logic.update.UpdateHandler$1.run(UpdateHandler.java:15) 
at java.lang.Thread.run(Thread.java:745) 

どうすれば修正できますか?

+1

マルチスレッドを理解するまで、複数のスレッドを使用しないでください。 – Holger

答えて

0

私が正しく思うなら、ここで for (Entity e : Main.frame.getEntityHandler().getEntities() は "エンティティ"コレクションの反復です。マルチスレッド環境下で繰り返し処理を行っているときに、他のスレッドが同時に「エンティティ」を変更すると、イテレータはこれをキャッチしてjava.util.ConcurrentModificationExceptionを投げます。 1つの簡単な修正は、このような反復プロセスにロックを追加することです。new Thread(new Runnable() { @Override public void run() { while (true) { try { Main.frame.onUpdate(); Thread.sleep(50); synchronized{ for (Entity e : Main.frame.getEntityHandler().getEntities()) { e.onUpdate(); } } } catch (Exception e) { e.printStackTrace(); } } } }).start(); これにより、パフォーマンス上のペナルティが追加されます。あなたがそれをしたいかどうかは分かりません。

関連する問題