2016-01-22 1 views
-1

J'ai une erreur ConcurrentModificationException; c'est la citation:Erreur ConcurrentModificationException

at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) 
at java.util.ArrayList$Itr.next(ArrayList.java:831) 
at org.eclipse.om2m.IOTproject.ipu.Monitor.start(Monitor.java:31) 
at org.eclipse.om2m.IOTproject.ipu.Activator$1$1.run(Activator.java:39) 

Ici il y a le début de fil en classe Moniteur:

public void start() throws Exception { 
    ServerUDP server = new ServerUDP(); 
    Thread t = new Thread(server); 
    t.start(); 

    while (true) { 
     Iterator<Pacchetto> it = server.A.iterator(); 

     while (it.hasNext()) { 
      Pacchetto o = (Pacchetto) it.next(); 
      Utils.insertResource(o); 

Cette classe appelle un fil en classe ServerUDP

public void run() { 
    Controllore c = new Controllore(A); 
    c.start(); 
    DatagramSocket serverSocket = null; 
    try { 
     serverSocket = new DatagramSocket(4445); 
     //TODO chiudi pacchetto 
    } catch (SocketException e1) { 
     e1.printStackTrace(); 
    } 
    byte[] receiveData = new byte[1024]; 
    while(true){ 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     try { 
      serverSocket.receive(receivePacket); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     String msg = new String(receivePacket.getData());  
     Date date = new Date(); 
     Pacchetto o = new Pacchetto(); 

      o.setIP(msg); 
      o.setTimestamp(date); 

      Iterator<Pacchetto> iterator1 = A.iterator(); 
      boolean flag = true; 
      while (iterator1.hasNext()) { 
       Pacchetto obj = (Pacchetto) iterator1.next(); 
       if (obj.getIP().equals(o.getIP())) { 
        obj.setTimestamp(o.getTimestamp()); 
        flag = false; 
        break; 
       } 
      } 

      if (flag) { 
       System.out.println("Added " + o.getIP()); 
       A.add(o); 
      } 

      System.out.println("Check -------------"); 
      for (int i=0; i< A.size() ; i++) 
      { 
       System.out.println(A.get(i).getIP());  
      } 
      } 
    } 
} 

Pacchetto est un objet, défini par moi. Comment puis-je résoudre ce problème? Merci

+0

Lire ce billet depuis la [Javadoc] (http://download.oracle.com/javase/1.4.2/docs/api/java/util/ConcurrentModificationException.html) – aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

+0

Vérifiez ce fil http : //stackoverflow.com/questions/8104692/how-to-avoid-java-util-concurrentmodificationexception-wheniterating-through-an –

+0

J'ai besoin de cloner l'arraylist dans la classe ServerUDP? –

Répondre

0

On dirait que le problème ici est que votre liste server.A n'est probablement pas sûre pour les threads. Puisque cette liste a le potentiel d'être accessible par plusieurs threads simultanément, nous ferions mieux de sécuriser l'accès simultané.

Nous avons besoin de faire quelques choses pour sécuriser ce thread de liste.

  1. Permet de synchroniser la liste A. Cela peut se faire comme

    List A = Collections.synchronizedList(new ArrayList()); 
    
  2. Nous devons nous assurer que toutes les itérations sur cette liste sont effectuées par un itérateur à l'intérieur d'un bloc synchronisé avec le verrou acquis sur la liste.

    synchronised (A) { 
        Iterator iterator1 = A.iterator(); // Must be in synchronized block 
        while (iterator1.hasNext()) 
        Pacchetto obj = (Pacchetto) iterator1.next(); 
    }