2016-01-22 2 views
-1

У меня ошибка ConcurrentModificationException; это цитата:Ошибка 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) 

Здесь есть начало нити в классе Monitor:

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); 

Этот класс вызывает поток в классе 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 является объект, определяемым меня. Как я могу исправить эту проблему? Спасибо

+0

Прочитайте это из [JavaDoc] (http://download.oracle.com/javase/1.4.2/docs/api/java/util/ConcurrentModificationException.html) – aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

+0

Проверить этот поток HTTP : //stackoverflow.com/questions/8104692/how-to-avoid-java-util-concurrentmodificationexception-when-iterating-through-an –

+0

Мне нужно клонировать arraylist в классе ServerUDP? –

ответ

0

Похоже, проблема в том, что ваш список server.A, вероятно, не является потокобезопасным. Поскольку этот список имеет потенциал для одновременного доступа к нескольким потокам, мы лучше сделаем его безопасным для одновременного доступа.

Мы должны сделать пару вещей, чтобы сделать этот список потоком безопасным.

  1. Позволяет сделать список A синхронизированным. Это может быть сделано как

    List A = Collections.synchronizedList(new ArrayList()); 
    
  2. Мы должны убедиться, что все итерации в этом списке выполняются через итератор внутри синхронизированного блока с с замком приобретаемого в списке.

    synchronised (A) { 
        Iterator iterator1 = A.iterator(); // Must be in synchronized block 
        while (iterator1.hasNext()) 
        Pacchetto obj = (Pacchetto) iterator1.next(); 
    } 
    
Смежные вопросы